<?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>TP5.0商城 &#8211; 个人随笔</title>
	<atom:link href="/classify/%E5%90%8E%E5%8F%B0%E6%A1%86%E6%9E%B6/tp5-0/tp5-0%E5%95%86%E5%9F%8E/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sat, 23 Jun 2018 10:38:44 +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>TP5.0商城 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>TP5 商城（一）环境部署、数据表、后台首页、用户 CURD、Ajax 状态切换、后台登录、后台退出、后台防翻墙、RBAC</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7682.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7682.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 09 Jun 2018 00:40:08 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Ajax 状态切换]]></category>
		<category><![CDATA[RBAC]]></category>
		<category><![CDATA[后台登录]]></category>
		<category><![CDATA[后台退出]]></category>
		<category><![CDATA[后台防翻墙]]></category>
		<category><![CDATA[后台首页]]></category>
		<category><![CDATA[数据表]]></category>
		<category><![CDATA[环境部署]]></category>
		<category><![CDATA[用户 CURD]]></category>
		<guid isPermaLink="false">/?p=7682</guid>

					<description><![CDATA[商城实战第一天 电商介绍 电子商务模式介绍 现在的电子商务平台主要分为以下几种类型： B2C ：全称-Busi [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>商城实战第一天</h1>
<h1>电商介绍</h1>
<h2>电子商务模式介绍</h2>
<p>现在的电子商务平台主要分为以下几种类型：</p>
<ul>
<li>B2C ：全称-Business to Consumer , 即企业与消费者之间的电子商务。</li>
</ul>
<p>常见的有B2C网站有：天猫（商家入驻（实体店,保证金20W），需要营业许可证等资料）、京东(商家也可入驻)、当当网、唯品会、凡客、小米、华为、oppo等</p>
<ul>
<li>C2C: 全称-Consumer to Consumer，即消费者与消费者之间的电子商务。</li>
</ul>
<p>典型的C2C网站就是国内的淘宝（需要交保证金2000元左右），还有58同城，二手交易网站如：闲鱼二手交易网。</p>
<ul>
<li>O2O: 全称-Online to Offline,线上与线下相结合的电子商务。</li>
</ul>
<p>常见的有：苏宁、美团、国美、滴滴打车等。</p>
<ul>
<li>B2B：全称-Business to Business 即企业与企业之间的电子商务。（阿里妈妈）</li>
</ul>
<h2>常见的开源商城</h2>
<h3>（1）Ecshop</h3>
<p>ECShop是一款B2C独立网店系统，适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。</p>
<p>网址：<a href="/goto/c9pa" rel="nofollow">http://www.ecshop.com/</a></p>
<p><img fetchpriority="high" decoding="async" width="1105" height="498" class="wp-image-7684" src="/wp-content/uploads/2018/06/word-image-286.png" srcset="/wp-content/uploads/2018/06/word-image-286.png 1105w, /wp-content/uploads/2018/06/word-image-286-300x135.png 300w, /wp-content/uploads/2018/06/word-image-286-768x346.png 768w, /wp-content/uploads/2018/06/word-image-286-1024x461.png 1024w" sizes="(max-width: 1105px) 100vw, 1105px" /></p>
<p>特点：开源、免费(个人学习使用没有任何问题)。但是企业使用用来盈利的话需要一定的授权费用（3000元左右）。</p>
<h3>（2）shopex</h3>
<p>网址：<a href="/goto/zptp" rel="nofollow">http://www.shopex.cn/</a></p>
<p>&nbsp;</p>
<p><img decoding="async" width="1087" height="468" class="wp-image-7685" src="/wp-content/uploads/2018/06/word-image-287.png" srcset="/wp-content/uploads/2018/06/word-image-287.png 1087w, /wp-content/uploads/2018/06/word-image-287-300x129.png 300w, /wp-content/uploads/2018/06/word-image-287-768x331.png 768w, /wp-content/uploads/2018/06/word-image-287-1024x441.png 1024w" sizes="(max-width: 1087px) 100vw, 1087px" /></p>
<p>特点：商业版，代码是加密过的。</p>
<h3>（3）shopnc</h3>
<p>网址: <a href="/goto/ajli" rel="nofollow">http://www.shopnc.net/</a></p>
<p>演示地址： <a href="/goto/ubug" rel="nofollow">http://b2b2c.shopnctest.com/dema/shop/index.php</a></p>
<p><img decoding="async" width="1104" height="416" class="wp-image-7686" src="/wp-content/uploads/2018/06/word-image-288.png" srcset="/wp-content/uploads/2018/06/word-image-288.png 1104w, /wp-content/uploads/2018/06/word-image-288-300x113.png 300w, /wp-content/uploads/2018/06/word-image-288-768x289.png 768w, /wp-content/uploads/2018/06/word-image-288-1024x386.png 1024w" sizes="(max-width: 1104px) 100vw, 1104px" /></p>
<p>特点：不开源、不免费</p>
<p>小结：</p>
<p>开源不代表免费，可以自己学习研究使用，但是以盈利为目的使用需要交一定的授权费用。</p>
<h2>安装Ecshop开源商城</h2>
<p>现在的Ecshop主要有以下两个版本：</p>
<ul>
<li>3.0版本：需要php5.4版本以上</li>
<li>2.7版本：需要在php5.3以下（如：phpstudy集成环境进行php降级），当然5.4、5、5版本也是可以的，只是需要修改部分代码。</li>
</ul>
<p>这里建议安装Ecshop的兼容版本，已经兼容各个php版本。</p>
<p><img loading="lazy" decoding="async" width="246" height="27" class="wp-image-7687" src="/wp-content/uploads/2018/06/word-image-289.png" /></p>
<h3>域名部署访问 ecshop</h3>
<p>一般把第三方开源项目部署在自己的机子上面域名前建议加个vendor,如：vendor.shop.com。明确知道这个程序是第三方程序。本地自己开发的项目话建议使用local进行开头，如:local.shop.com。</p>
<p>步骤1：把ecshop开源程序的所有的文件复制到我们的项目目录</p>
<p><img loading="lazy" decoding="async" width="841" height="424" class="wp-image-7688" src="/wp-content/uploads/2018/06/word-image-290.png" srcset="/wp-content/uploads/2018/06/word-image-290.png 841w, /wp-content/uploads/2018/06/word-image-290-300x151.png 300w, /wp-content/uploads/2018/06/word-image-290-768x387.png 768w" sizes="(max-width: 841px) 100vw, 841px" /></p>
<p>步骤2：配置虚拟主机，如域名为上面的vendor.ecshop.com</p>
<ol>
<li>phpstudy设置虚拟主机</li>
<li>设置host文件映射</li>
<li>重启phpstudy</li>
</ol>
<p>步骤3：输入域名进行安装配置</p>
<ol>
<li>勾选</li>
</ol>
<p><img loading="lazy" decoding="async" width="1088" height="661" class="wp-image-7689" src="/wp-content/uploads/2018/06/word-image-291.png" srcset="/wp-content/uploads/2018/06/word-image-291.png 1088w, /wp-content/uploads/2018/06/word-image-291-300x182.png 300w, /wp-content/uploads/2018/06/word-image-291-768x467.png 768w, /wp-content/uploads/2018/06/word-image-291-1024x622.png 1024w" sizes="(max-width: 1088px) 100vw, 1088px" /></p>
<p>b、配置系统</p>
<p><img loading="lazy" decoding="async" width="861" height="267" class="wp-image-7690" src="/wp-content/uploads/2018/06/word-image-292.png" srcset="/wp-content/uploads/2018/06/word-image-292.png 861w, /wp-content/uploads/2018/06/word-image-292-300x93.png 300w, /wp-content/uploads/2018/06/word-image-292-768x238.png 768w" sizes="(max-width: 861px) 100vw, 861px" /></p>
<p>c、配置数据库的信息</p>
<p><img loading="lazy" decoding="async" width="777" height="650" class="wp-image-7691" src="/wp-content/uploads/2018/06/word-image-293.png" srcset="/wp-content/uploads/2018/06/word-image-293.png 777w, /wp-content/uploads/2018/06/word-image-293-300x251.png 300w, /wp-content/uploads/2018/06/word-image-293-768x642.png 768w" sizes="(max-width: 777px) 100vw, 777px" /> <img loading="lazy" decoding="async" width="834" height="242" class="wp-image-7692" src="/wp-content/uploads/2018/06/word-image-294.png" srcset="/wp-content/uploads/2018/06/word-image-294.png 834w, /wp-content/uploads/2018/06/word-image-294-300x87.png 300w, /wp-content/uploads/2018/06/word-image-294-768x223.png 768w" sizes="(max-width: 834px) 100vw, 834px" /></p>
<p>访问ecshop前台：<a href="/goto/z1k0" rel="nofollow">http:/域名/</a></p>
<p>访问ecshop后台：<a href="/goto/1knx" rel="nofollow">http:/域名/admin/</a></p>
<p><img loading="lazy" decoding="async" width="781" height="382" class="wp-image-7693" src="/wp-content/uploads/2018/06/word-image-295.png" srcset="/wp-content/uploads/2018/06/word-image-295.png 781w, /wp-content/uploads/2018/06/word-image-295-300x147.png 300w, /wp-content/uploads/2018/06/word-image-295-768x376.png 768w" sizes="(max-width: 781px) 100vw, 781px" /></p>
<h1>部署tp5商城项目环境</h1>
<h2>部署虚拟主机</h2>
<p>三步：</p>
<p>步骤1：把tp5项目程序复制指定虚拟目录</p>
<p>步骤2：使用phpstudy配置域名如为：<a href="/goto/x9uh" rel="nofollow">www.php15shop.com</a>，虚拟目录需要绑定到public目录下面</p>
<p>步骤3：设置hosts文件映射</p>
<p>最后访问如下，说明配置成功：</p>
<p><img loading="lazy" decoding="async" width="693" height="379" class="wp-image-7694" src="/wp-content/uploads/2018/06/word-image-296.png" srcset="/wp-content/uploads/2018/06/word-image-296.png 693w, /wp-content/uploads/2018/06/word-image-296-300x164.png 300w" sizes="(max-width: 693px) 100vw, 693px" /></p>
<h2>导入商城项目所有数据表</h2>
<p>建议使用navicat可视化工具进行完成，找到对应的sql文件，进行导入。</p>
<p>要先创建一个数据库，如php15shop</p>
<p><img loading="lazy" decoding="async" width="736" height="210" class="wp-image-7695" src="/wp-content/uploads/2018/06/word-image-297.png" srcset="/wp-content/uploads/2018/06/word-image-297.png 736w, /wp-content/uploads/2018/06/word-image-297-300x86.png 300w" sizes="(max-width: 736px) 100vw, 736px" /></p>
<p>&nbsp;</p>
<p>每张表的字段信息可以参考数据库文档：</p>
<p><img loading="lazy" decoding="async" width="652" height="66" class="wp-image-7696" src="/wp-content/uploads/2018/06/word-image-298.png" srcset="/wp-content/uploads/2018/06/word-image-298.png 652w, /wp-content/uploads/2018/06/word-image-298-300x30.png 300w" sizes="(max-width: 652px) 100vw, 652px" /></p>
<h2>项目前的一些配置</h2>
<p>我们可以先把数据库、控制器后缀、静态资源目录等一些基本配置先定义好。</p>
<ul>
<li>数据库配置</li>
</ul>
<p><img loading="lazy" decoding="async" width="935" height="629" class="wp-image-7697" src="/wp-content/uploads/2018/06/word-image-299.png" srcset="/wp-content/uploads/2018/06/word-image-299.png 935w, /wp-content/uploads/2018/06/word-image-299-300x202.png 300w, /wp-content/uploads/2018/06/word-image-299-768x517.png 768w" sizes="(max-width: 935px) 100vw, 935px" /></p>
<ul>
<li>控制器后缀</li>
</ul>
<p><img loading="lazy" decoding="async" width="798" height="303" class="wp-image-7698" src="/wp-content/uploads/2018/06/word-image-300.png" srcset="/wp-content/uploads/2018/06/word-image-300.png 798w, /wp-content/uploads/2018/06/word-image-300-300x114.png 300w, /wp-content/uploads/2018/06/word-image-300-768x292.png 768w" sizes="(max-width: 798px) 100vw, 798px" /></p>
<ul>
<li>配置静态资源路径，把后台静态资源放到相应的目录,配置后台密码加密验salt</li>
</ul>
<p><img loading="lazy" decoding="async" width="767" height="329" class="wp-image-7699" src="/wp-content/uploads/2018/06/word-image-301.png" srcset="/wp-content/uploads/2018/06/word-image-301.png 767w, /wp-content/uploads/2018/06/word-image-301-300x129.png 300w" sizes="(max-width: 767px) 100vw, 767px" /></p>
<ul>
<li>先设置默认模块为admin、开发前台时（项目上线）设置为home</li>
</ul>
<p><img loading="lazy" decoding="async" width="785" height="161" class="wp-image-7700" src="/wp-content/uploads/2018/06/word-image-302.png" srcset="/wp-content/uploads/2018/06/word-image-302.png 785w, /wp-content/uploads/2018/06/word-image-302-300x62.png 300w, /wp-content/uploads/2018/06/word-image-302-768x158.png 768w" sizes="(max-width: 785px) 100vw, 785px" /></p>
<ul>
<li>并且开启调试模式,页面trace调试，看到错误的详细信息</li>
</ul>
<p><img loading="lazy" decoding="async" width="866" height="277" class="wp-image-7701" src="/wp-content/uploads/2018/06/word-image-303.png" srcset="/wp-content/uploads/2018/06/word-image-303.png 866w, /wp-content/uploads/2018/06/word-image-303-300x96.png 300w, /wp-content/uploads/2018/06/word-image-303-768x246.png 768w" sizes="(max-width: 866px) 100vw, 866px" /></p>
<p>开启页面trace调试，页面右下角多处一个图标。</p>
<p><img loading="lazy" decoding="async" width="153" height="49" class="wp-image-7702" src="/wp-content/uploads/2018/06/word-image-304.png" srcset="/wp-content/uploads/2018/06/word-image-304.png 153w, /wp-content/uploads/2018/06/word-image-304-150x49.png 150w" sizes="(max-width: 153px) 100vw, 153px" /></p>
<ul>
<li>开启模型获取数据返回关联数组的配置</li>
</ul>
<p><img loading="lazy" decoding="async" width="901" height="177" class="wp-image-7703" src="/wp-content/uploads/2018/06/word-image-305.png" srcset="/wp-content/uploads/2018/06/word-image-305.png 901w, /wp-content/uploads/2018/06/word-image-305-300x59.png 300w, /wp-content/uploads/2018/06/word-image-305-768x151.png 768w" sizes="(max-width: 901px) 100vw, 901px" /></p>
<ul>
<li>修改重写文件.htaccess隐藏单一入口文件访问</li>
</ul>
<p>这里需要在httpd.conf开启rewrite重写模块，和在虚拟主机中把 AllowOverride None改为 AllowOverride All，这两步在安装phpstudy的时候和配置虚拟主机时其已经帮我们设置好了。</p>
<p>只需要改修改重写文件.htaccess，前面加个问号?</p>
<h1>三、搭建后台首页</h1>
<p><img loading="lazy" decoding="async" width="844" height="270" class="wp-image-7704" src="/wp-content/uploads/2018/06/word-image-306.png" srcset="/wp-content/uploads/2018/06/word-image-306.png 844w, /wp-content/uploads/2018/06/word-image-306-300x96.png 300w, /wp-content/uploads/2018/06/word-image-306-768x246.png 768w" sizes="(max-width: 844px) 100vw, 844px" /></p>
<p>步骤1：在后台admin建立一个index控制器，分别建立top、main、left、index</p>
<p><img loading="lazy" decoding="async" width="774" height="613" class="wp-image-7705" src="/wp-content/uploads/2018/06/word-image-307.png" srcset="/wp-content/uploads/2018/06/word-image-307.png 774w, /wp-content/uploads/2018/06/word-image-307-300x238.png 300w, /wp-content/uploads/2018/06/word-image-307-768x608.png 768w" sizes="(max-width: 774px) 100vw, 774px" /></p>
<p>步骤2：复制后台指定的模板到指定的目录，并且修改每个模板的静态资源路径</p>
<p><img loading="lazy" decoding="async" width="1264" height="457" class="wp-image-7706" src="/wp-content/uploads/2018/06/word-image-308.png" srcset="/wp-content/uploads/2018/06/word-image-308.png 1264w, /wp-content/uploads/2018/06/word-image-308-300x108.png 300w, /wp-content/uploads/2018/06/word-image-308-768x278.png 768w, /wp-content/uploads/2018/06/word-image-308-1024x370.png 1024w" sizes="(max-width: 1264px) 100vw, 1264px" /></p>
<p>访问效果：</p>
<p><img loading="lazy" decoding="async" width="744" height="432" class="wp-image-7707" src="/wp-content/uploads/2018/06/word-image-309.png" srcset="/wp-content/uploads/2018/06/word-image-309.png 744w, /wp-content/uploads/2018/06/word-image-309-300x174.png 300w" sizes="(max-width: 744px) 100vw, 744px" /></p>
<h1>四、用户表的CURD操作</h1>
<h3>完成用户的添加功能</h3>
<p>步骤1：在后台创建User控制器，并建立一个add方法输出模板内容</p>
<p><img loading="lazy" decoding="async" width="794" height="286" class="wp-image-7708" src="/wp-content/uploads/2018/06/word-image-310.png" srcset="/wp-content/uploads/2018/06/word-image-310.png 794w, /wp-content/uploads/2018/06/word-image-310-300x108.png 300w, /wp-content/uploads/2018/06/word-image-310-768x277.png 768w" sizes="(max-width: 794px) 100vw, 794px" /></p>
<p>步骤2：修改add.html模板的name名称</p>
<p><img loading="lazy" decoding="async" width="1286" height="622" class="wp-image-7709" src="/wp-content/uploads/2018/06/word-image-311.png" srcset="/wp-content/uploads/2018/06/word-image-311.png 1286w, /wp-content/uploads/2018/06/word-image-311-300x145.png 300w, /wp-content/uploads/2018/06/word-image-311-768x371.png 768w, /wp-content/uploads/2018/06/word-image-311-1024x495.png 1024w" sizes="(max-width: 1286px) 100vw, 1286px" /></p>
<p>步骤3：定义当前表的验证器</p>
<p><img loading="lazy" decoding="async" width="1209" height="714" class="wp-image-7710" src="/wp-content/uploads/2018/06/word-image-312.png" srcset="/wp-content/uploads/2018/06/word-image-312.png 1209w, /wp-content/uploads/2018/06/word-image-312-300x177.png 300w, /wp-content/uploads/2018/06/word-image-312-768x454.png 768w, /wp-content/uploads/2018/06/word-image-312-1024x605.png 1024w" sizes="(max-width: 1209px) 100vw, 1209px" /></p>
<p>步骤4：在模型中定义前入库的钩子事件，完成密码字段的加密</p>
<p><img loading="lazy" decoding="async" width="1101" height="436" class="wp-image-7711" src="/wp-content/uploads/2018/06/word-image-313.png" srcset="/wp-content/uploads/2018/06/word-image-313.png 1101w, /wp-content/uploads/2018/06/word-image-313-300x119.png 300w, /wp-content/uploads/2018/06/word-image-313-768x304.png 768w, /wp-content/uploads/2018/06/word-image-313-1024x406.png 1024w" sizes="(max-width: 1101px) 100vw, 1101px" /></p>
<p>步骤5：控制器完成验证入库操作</p>
<p><img loading="lazy" decoding="async" width="1191" height="699" class="wp-image-7712" src="/wp-content/uploads/2018/06/word-image-314.png" srcset="/wp-content/uploads/2018/06/word-image-314.png 1191w, /wp-content/uploads/2018/06/word-image-314-300x176.png 300w, /wp-content/uploads/2018/06/word-image-314-768x451.png 768w, /wp-content/uploads/2018/06/word-image-314-1024x601.png 1024w" sizes="(max-width: 1191px) 100vw, 1191px" /></p>
<h3>完成用户列表功能及分页</h3>
<p>步骤1：在后台User控制器建立一个index方法，取出所有的用户数据，并分配到模板中</p>
<p><img loading="lazy" decoding="async" width="831" height="395" class="wp-image-7713" src="/wp-content/uploads/2018/06/word-image-315.png" srcset="/wp-content/uploads/2018/06/word-image-315.png 831w, /wp-content/uploads/2018/06/word-image-315-300x143.png 300w, /wp-content/uploads/2018/06/word-image-315-768x365.png 768w" sizes="(max-width: 831px) 100vw, 831px" /></p>
<p>步骤2：模板遍历数据</p>
<p><img loading="lazy" decoding="async" width="1039" height="601" class="wp-image-7714" src="/wp-content/uploads/2018/06/word-image-316.png" srcset="/wp-content/uploads/2018/06/word-image-316.png 1039w, /wp-content/uploads/2018/06/word-image-316-300x174.png 300w, /wp-content/uploads/2018/06/word-image-316-768x444.png 768w, /wp-content/uploads/2018/06/word-image-316-1024x592.png 1024w" sizes="(max-width: 1039px) 100vw, 1039px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="941" height="192" class="wp-image-7715" src="/wp-content/uploads/2018/06/word-image-317.png" srcset="/wp-content/uploads/2018/06/word-image-317.png 941w, /wp-content/uploads/2018/06/word-image-317-300x61.png 300w, /wp-content/uploads/2018/06/word-image-317-768x157.png 768w" sizes="(max-width: 941px) 100vw, 941px" /></p>
<h3>完成用户的编辑功能</h3>
<p>编辑用户的时候，密码选项需要考虑两种情况：</p>
<p>①如密码和确认密码都为空，说明用户不想修改密码，则保留原来的密码。</p>
<p>②如果两个密码有一个不为空，说明用户想修改密码，则必须要求用户两次密码一致。</p>
<p>代码如下：</p>
<p>步骤1：给编辑的设置一个链接地址，携带一个主键值</p>
<p><img loading="lazy" decoding="async" width="1260" height="305" class="wp-image-7716" src="/wp-content/uploads/2018/06/word-image-318.png" srcset="/wp-content/uploads/2018/06/word-image-318.png 1260w, /wp-content/uploads/2018/06/word-image-318-300x73.png 300w, /wp-content/uploads/2018/06/word-image-318-768x186.png 768w, /wp-content/uploads/2018/06/word-image-318-1024x248.png 1024w" sizes="(max-width: 1260px) 100vw, 1260px" /></p>
<p>步骤2：使用jquery-validate对密码字段进行验证</p>
<p><img loading="lazy" decoding="async" width="1008" height="318" class="wp-image-7717" src="/wp-content/uploads/2018/06/word-image-319.png" srcset="/wp-content/uploads/2018/06/word-image-319.png 1008w, /wp-content/uploads/2018/06/word-image-319-300x95.png 300w, /wp-content/uploads/2018/06/word-image-319-768x242.png 768w" sizes="(max-width: 1008px) 100vw, 1008px" /></p>
<p>规则如下：</p>
<p><img loading="lazy" decoding="async" width="841" height="711" class="wp-image-7718" src="/wp-content/uploads/2018/06/word-image-320.png" srcset="/wp-content/uploads/2018/06/word-image-320.png 841w, /wp-content/uploads/2018/06/word-image-320-300x254.png 300w, /wp-content/uploads/2018/06/word-image-320-768x649.png 768w" sizes="(max-width: 841px) 100vw, 841px" /> <img loading="lazy" decoding="async" width="590" height="144" class="wp-image-7719" src="/wp-content/uploads/2018/06/word-image-321.png" srcset="/wp-content/uploads/2018/06/word-image-321.png 590w, /wp-content/uploads/2018/06/word-image-321-300x73.png 300w" sizes="(max-width: 590px) 100vw, 590px" /></p>
<p>注：要修改style.css文件样式，因为有样式冲突</p>
<p><img loading="lazy" decoding="async" width="1138" height="179" class="wp-image-7720" src="/wp-content/uploads/2018/06/word-image-322.png" srcset="/wp-content/uploads/2018/06/word-image-322.png 1138w, /wp-content/uploads/2018/06/word-image-322-300x47.png 300w, /wp-content/uploads/2018/06/word-image-322-768x121.png 768w, /wp-content/uploads/2018/06/word-image-322-1024x161.png 1024w" sizes="(max-width: 1138px) 100vw, 1138px" /></p>
<p>设置upd.html模板内容回显数据：</p>
<p><img loading="lazy" decoding="async" width="1270" height="671" class="wp-image-7721" src="/wp-content/uploads/2018/06/word-image-323.png" srcset="/wp-content/uploads/2018/06/word-image-323.png 1270w, /wp-content/uploads/2018/06/word-image-323-300x159.png 300w, /wp-content/uploads/2018/06/word-image-323-768x406.png 768w, /wp-content/uploads/2018/06/word-image-323-1024x541.png 1024w" sizes="(max-width: 1270px) 100vw, 1270px" /></p>
<p>步骤3：upd方法中完成编辑的验证编辑入库</p>
<p><img loading="lazy" decoding="async" width="1160" height="520" class="wp-image-7722" src="/wp-content/uploads/2018/06/word-image-324.png" srcset="/wp-content/uploads/2018/06/word-image-324.png 1160w, /wp-content/uploads/2018/06/word-image-324-300x134.png 300w, /wp-content/uploads/2018/06/word-image-324-768x344.png 768w, /wp-content/uploads/2018/06/word-image-324-1024x459.png 1024w" sizes="(max-width: 1160px) 100vw, 1160px" /></p>
<p>同时修改编辑场景的验证器：</p>
<p><img loading="lazy" decoding="async" width="1002" height="485" class="wp-image-7723" src="/wp-content/uploads/2018/06/word-image-325.png" srcset="/wp-content/uploads/2018/06/word-image-325.png 1002w, /wp-content/uploads/2018/06/word-image-325-300x145.png 300w, /wp-content/uploads/2018/06/word-image-325-768x372.png 768w" sizes="(max-width: 1002px) 100vw, 1002px" /></p>
<h3>ajax控制用户的登录状态</h3>
<p>步骤1：先给标签加一个a标签，并且阻止默认行为，同时加一个is_active和user_id属性，目的是获取当前记录的状态值和主键值，并且绑定类名为changeActive。</p>
<p><img loading="lazy" decoding="async" width="1197" height="259" class="wp-image-7724" src="/wp-content/uploads/2018/06/word-image-326.png" srcset="/wp-content/uploads/2018/06/word-image-326.png 1197w, /wp-content/uploads/2018/06/word-image-326-300x65.png 300w, /wp-content/uploads/2018/06/word-image-326-768x166.png 768w, /wp-content/uploads/2018/06/word-image-326-1024x222.png 1024w" sizes="(max-width: 1197px) 100vw, 1197px" /></p>
<p>步骤2：给class=changeActive 绑定单击事件，发送ajax请求</p>
<p><img loading="lazy" decoding="async" width="1244" height="493" class="wp-image-7725" src="/wp-content/uploads/2018/06/word-image-327.png" srcset="/wp-content/uploads/2018/06/word-image-327.png 1244w, /wp-content/uploads/2018/06/word-image-327-300x119.png 300w, /wp-content/uploads/2018/06/word-image-327-768x304.png 768w, /wp-content/uploads/2018/06/word-image-327-1024x406.png 1024w" sizes="(max-width: 1244px) 100vw, 1244px" /></p>
<p>步骤3：在User控制器建立一个ajaxChangeActive方法，完成状态的更改</p>
<p><img loading="lazy" decoding="async" width="831" height="646" class="wp-image-7726" src="/wp-content/uploads/2018/06/word-image-328.png" srcset="/wp-content/uploads/2018/06/word-image-328.png 831w, /wp-content/uploads/2018/06/word-image-328-300x233.png 300w, /wp-content/uploads/2018/06/word-image-328-768x597.png 768w" sizes="(max-width: 831px) 100vw, 831px" /></p>
<p>注意：由于更改状态值的时候会触发编辑的前钩子，这时候没有携带密码字段前钩子会直接报错，解决办法：对前钩子有没有密码字段进行isset判断即可:</p>
<p><img loading="lazy" decoding="async" width="971" height="482" class="wp-image-7727" src="/wp-content/uploads/2018/06/word-image-329.png" srcset="/wp-content/uploads/2018/06/word-image-329.png 971w, /wp-content/uploads/2018/06/word-image-329-300x149.png 300w, /wp-content/uploads/2018/06/word-image-329-768x381.png 768w" sizes="(max-width: 971px) 100vw, 971px" /></p>
<p>提示：调试ajax的时候，务必要打开控制器network进行调试。可以打开response选项看报啥错，这样可以快速定位到错误的原因。</p>
<h1>五、完成后台用户登录|退出|防翻墙功能</h1>
<h2>完成后台登录功能</h2>
<p>步骤1：在后台建立一个Public控制器，并建立一个login方法，输出登录模板同时，同时完成登录的功能实现</p>
<p><img loading="lazy" decoding="async" width="1135" height="651" class="wp-image-7728" src="/wp-content/uploads/2018/06/word-image-330.png" srcset="/wp-content/uploads/2018/06/word-image-330.png 1135w, /wp-content/uploads/2018/06/word-image-330-300x172.png 300w, /wp-content/uploads/2018/06/word-image-330-768x441.png 768w, /wp-content/uploads/2018/06/word-image-330-1024x587.png 1024w" sizes="(max-width: 1135px) 100vw, 1135px" /></p>
<p>同时在User模型中，定义一个checkUser的方法，检测用户名和密码是否相等</p>
<p><img loading="lazy" decoding="async" width="1030" height="529" class="wp-image-7729" src="/wp-content/uploads/2018/06/word-image-331.png" srcset="/wp-content/uploads/2018/06/word-image-331.png 1030w, /wp-content/uploads/2018/06/word-image-331-300x154.png 300w, /wp-content/uploads/2018/06/word-image-331-768x394.png 768w, /wp-content/uploads/2018/06/word-image-331-1024x526.png 1024w" sizes="(max-width: 1030px) 100vw, 1030px" /></p>
<p>步骤2：修改login.html模板内容，显示验证码</p>
<p><img loading="lazy" decoding="async" width="1267" height="689" class="wp-image-7730" src="/wp-content/uploads/2018/06/word-image-332.png" srcset="/wp-content/uploads/2018/06/word-image-332.png 1267w, /wp-content/uploads/2018/06/word-image-332-300x163.png 300w, /wp-content/uploads/2018/06/word-image-332-768x418.png 768w, /wp-content/uploads/2018/06/word-image-332-1024x557.png 1024w" sizes="(max-width: 1267px) 100vw, 1267px" /> <img loading="lazy" decoding="async" width="1167" height="425" class="wp-image-7731" src="/wp-content/uploads/2018/06/word-image-333.png" srcset="/wp-content/uploads/2018/06/word-image-333.png 1167w, /wp-content/uploads/2018/06/word-image-333-300x109.png 300w, /wp-content/uploads/2018/06/word-image-333-768x280.png 768w, /wp-content/uploads/2018/06/word-image-333-1024x373.png 1024w" sizes="(max-width: 1167px) 100vw, 1167px" /></p>
<p>步骤3：在验证器中定义登录场景的验证规则</p>
<p><img loading="lazy" decoding="async" width="1264" height="690" class="wp-image-7732" src="/wp-content/uploads/2018/06/word-image-334.png" srcset="/wp-content/uploads/2018/06/word-image-334.png 1264w, /wp-content/uploads/2018/06/word-image-334-300x164.png 300w, /wp-content/uploads/2018/06/word-image-334-768x419.png 768w, /wp-content/uploads/2018/06/word-image-334-1024x559.png 1024w" sizes="(max-width: 1264px) 100vw, 1264px" /></p>
<p>登录成功，在top.html中回显用户名</p>
<p><img loading="lazy" decoding="async" width="1024" height="214" class="wp-image-7733" src="/wp-content/uploads/2018/06/word-image-335.png" srcset="/wp-content/uploads/2018/06/word-image-335.png 1024w, /wp-content/uploads/2018/06/word-image-335-300x63.png 300w, /wp-content/uploads/2018/06/word-image-335-768x161.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<h2>完成后台退出功能</h2>
<p>步骤1：在后台Public控制器建立一个logout的退出方法</p>
<p><img loading="lazy" decoding="async" width="831" height="296" class="wp-image-7734" src="/wp-content/uploads/2018/06/word-image-336.png" srcset="/wp-content/uploads/2018/06/word-image-336.png 831w, /wp-content/uploads/2018/06/word-image-336-300x107.png 300w, /wp-content/uploads/2018/06/word-image-336-768x274.png 768w" sizes="(max-width: 831px) 100vw, 831px" /></p>
<h2>防用户翻墙</h2>
<p>防翻墙思想：建立一个父控制器如：CommonController,在此控制器的构造函数中做session的判断，其他需要进行验证session的控制器就继承此公共控制器即可防止翻墙，某些控制器不需要session判断则不继承即可。（如:PublicController）</p>
<p><img loading="lazy" decoding="async" width="991" height="358" class="wp-image-7735" src="/wp-content/uploads/2018/06/word-image-337.png" srcset="/wp-content/uploads/2018/06/word-image-337.png 991w, /wp-content/uploads/2018/06/word-image-337-300x108.png 300w, /wp-content/uploads/2018/06/word-image-337-768x277.png 768w" sizes="(max-width: 991px) 100vw, 991px" /></p>
<p>其中Index 和User控制器需要继承Common，public不需要继承</p>
<p><img loading="lazy" decoding="async" width="831" height="164" class="wp-image-7736" src="/wp-content/uploads/2018/06/word-image-338.png" srcset="/wp-content/uploads/2018/06/word-image-338.png 831w, /wp-content/uploads/2018/06/word-image-338-300x59.png 300w, /wp-content/uploads/2018/06/word-image-338-768x152.png 768w" sizes="(max-width: 831px) 100vw, 831px" /> <img loading="lazy" decoding="async" width="834" height="172" class="wp-image-7737" src="/wp-content/uploads/2018/06/word-image-339.png" srcset="/wp-content/uploads/2018/06/word-image-339.png 834w, /wp-content/uploads/2018/06/word-image-339-300x62.png 300w, /wp-content/uploads/2018/06/word-image-339-768x158.png 768w" sizes="(max-width: 834px) 100vw, 834px" /></p>
<h1>六、RBAC权限控制</h1>
<h2>RBAC介绍</h2>
<p>RBAC: Role Based Access Controller ,即基于角色的访问权限控制。</p>
<p>简单的说,用户登录可以属于不同的角色，不同的角色拥有的后台访问菜单权限也不一样。</p>
<p>如：</p>
<p>如下面的每个菜单就是一个权限。</p>
<p><img loading="lazy" decoding="async" width="190" height="124" class="wp-image-7738" src="/wp-content/uploads/2018/06/word-image-340.png" /></p>
<p>后台菜单中权限一般只控制到两级权限，权限级别太深难以维护，具体要看项目需求。</p>
<p>一级权限：如：商品管理。</p>
<p>二级权限：如：商品添加、商品列表。</p>
<p>三级权限：如：商品列表中的编辑或删除操作</p>
<h2>RBAC表的表设计</h2>
<p>一般RBAC权限控制都3张表和5张表，其核心都是一样。</p>
<p>3张表：后台用户表、角色表、权限表。</p>
<p>而5张表仅把用户表和角色表、角色表和权限表其相关联的字段分别使用一个表来维护。且表多了维护起来更加繁琐。</p>
<p>这里我们采用3张表来做权限控制。</p>
<p>三张表的关系如下：</p>
<p><img loading="lazy" decoding="async" width="749" height="293" class="wp-image-7739" src="/wp-content/uploads/2018/06/word-image-341.png" srcset="/wp-content/uploads/2018/06/word-image-341.png 749w, /wp-content/uploads/2018/06/word-image-341-300x117.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p>分析：</p>
<ul>
<li>用户表通过角色字段role_id，找到与其关联的角色表role_id。</li>
<li>角色表通过所拥有的所有权限字段auth_id_list，找到与其关联的权限表的auth_id。</li>
</ul>
<p>控制权限图解：</p>
<p><img loading="lazy" decoding="async" width="1127" height="449" class="wp-image-7740" src="/wp-content/uploads/2018/06/word-image-342.png" srcset="/wp-content/uploads/2018/06/word-image-342.png 1127w, /wp-content/uploads/2018/06/word-image-342-300x120.png 300w, /wp-content/uploads/2018/06/word-image-342-768x306.png 768w, /wp-content/uploads/2018/06/word-image-342-1024x408.png 1024w" sizes="(max-width: 1127px) 100vw, 1127px" /></p>
<p>可见，一个用户对应着一个角色，一个角色可以拥有多个权限。</p>
<h1>七、RBAC功能实现</h1>
<h2>权限表的curd操作</h2>
<h3>（1）完成权限的添加</h3>
<p>步骤1：在后台建立一个Auth控制器，并建立一个add方法，输出模板内容，并完成添加权限的实现</p>
<p><img loading="lazy" decoding="async" width="1028" height="717" class="wp-image-7741" src="/wp-content/uploads/2018/06/word-image-343.png" srcset="/wp-content/uploads/2018/06/word-image-343.png 1028w, /wp-content/uploads/2018/06/word-image-343-300x209.png 300w, /wp-content/uploads/2018/06/word-image-343-768x536.png 768w, /wp-content/uploads/2018/06/word-image-343-1024x714.png 1024w" sizes="(max-width: 1028px) 100vw, 1028px" /></p>
<p>同时在Auth模型中取出权限的无限级分类数据：</p>
<p><img loading="lazy" decoding="async" width="965" height="680" class="wp-image-7742" src="/wp-content/uploads/2018/06/word-image-344.png" srcset="/wp-content/uploads/2018/06/word-image-344.png 965w, /wp-content/uploads/2018/06/word-image-344-300x211.png 300w, /wp-content/uploads/2018/06/word-image-344-768x541.png 768w" sizes="(max-width: 965px) 100vw, 965px" /></p>
<p>步骤2：设置add.html模板内容</p>
<p><img loading="lazy" decoding="async" width="1230" height="699" class="wp-image-7743" src="/wp-content/uploads/2018/06/word-image-345.png" srcset="/wp-content/uploads/2018/06/word-image-345.png 1230w, /wp-content/uploads/2018/06/word-image-345-300x170.png 300w, /wp-content/uploads/2018/06/word-image-345-768x436.png 768w, /wp-content/uploads/2018/06/word-image-345-1024x582.png 1024w" sizes="(max-width: 1230px) 100vw, 1230px" /></p>
<p>当选择顶级权限时，控制器名和方法名不可用，否则可用。因为顶级权限没有控制器名和方法名。</p>
<p><img loading="lazy" decoding="async" width="1179" height="481" class="wp-image-7744" src="/wp-content/uploads/2018/06/word-image-346.png" srcset="/wp-content/uploads/2018/06/word-image-346.png 1179w, /wp-content/uploads/2018/06/word-image-346-300x122.png 300w, /wp-content/uploads/2018/06/word-image-346-768x313.png 768w, /wp-content/uploads/2018/06/word-image-346-1024x418.png 1024w" sizes="(max-width: 1179px) 100vw, 1179px" /></p>
<p>注意：表单input设置disabled和readonly的区别</p>
<p>相同点：都不可以编辑input中的数据</p>
<p>不同点：设置disabled时，php中通过$_POST接收不到input框name的属性值</p>
<p>设置readonly时，php中通过$_POST可以收到input的name的属性值</p>
<p>步骤3：定义Auth验证器，进行验证</p>
<p><img loading="lazy" decoding="async" width="773" height="636" class="wp-image-7745" src="/wp-content/uploads/2018/06/word-image-347.png" srcset="/wp-content/uploads/2018/06/word-image-347.png 773w, /wp-content/uploads/2018/06/word-image-347-300x247.png 300w, /wp-content/uploads/2018/06/word-image-347-768x632.png 768w" sizes="(max-width: 773px) 100vw, 773px" /></p>
<p>模板效果：</p>
<p><img loading="lazy" decoding="async" width="542" height="323" class="wp-image-7746" src="/wp-content/uploads/2018/06/word-image-348.png" srcset="/wp-content/uploads/2018/06/word-image-348.png 542w, /wp-content/uploads/2018/06/word-image-348-300x180.png 300w" sizes="(max-width: 542px) 100vw, 542px" /></p>
<h3>完成权限的列表展示</h3>
<h3>完成权限的编辑</h3>
<h3>完成权限的删除</h3>
<h2>角色表的curd操作</h2>
<h3>添加角色及分配权限</h3>
<p>注：一般系统角色名为超级管理员都会拥有所有的权限，其权限字段auth_id_list可以手动设置为*。</p>
<h3>（2）角色的列表展示</h3>
<p>把一个角色所拥有的权限都查出来，这里需要利用到两个mysql函数：</p>
<p>FIND_IN_SET和group_concat(字段)</p>
<ul>
<li>FIND_IN_SET(str,strlist) :</li>
</ul>
<p>作用：查询出子串str，是否在由逗号分隔的目标字符串strlist中存在。</p>
<p>如：判断5是否在字符串1,2,3,4,5中存在：FIND_IN_SET(5,‘1,2,3,4,5’) ，存在则返回所在目标字符串strlist的所在位置，不存在则返回0。</p>
<p><img loading="lazy" decoding="async" width="643" height="83" class="wp-image-7747" src="/wp-content/uploads/2018/06/word-image-349.png" srcset="/wp-content/uploads/2018/06/word-image-349.png 643w, /wp-content/uploads/2018/06/word-image-349-300x39.png 300w" sizes="(max-width: 643px) 100vw, 643px" /> <img loading="lazy" decoding="async" width="476" height="77" class="wp-image-7748" src="/wp-content/uploads/2018/06/word-image-350.png" srcset="/wp-content/uploads/2018/06/word-image-350.png 476w, /wp-content/uploads/2018/06/word-image-350-300x49.png 300w" sizes="(max-width: 476px) 100vw, 476px" /></p>
<ul>
<li>group_concat(字段)</li>
</ul>
<p>作用：主要根据某个字段进行分组，把相同字段的值连接在一起。</p>
<p>默认连接符号是逗号 ，如果用|连接则：</p>
<p>group_concat(字段名 SEPARATOR “|”)</p>
<p>例：如下是表tp_article表中的一些数据</p>
<p><img loading="lazy" decoding="async" width="400" height="150" class="wp-image-7749" src="/wp-content/uploads/2018/06/word-image-351.png" srcset="/wp-content/uploads/2018/06/word-image-351.png 400w, /wp-content/uploads/2018/06/word-image-351-300x113.png 300w" sizes="(max-width: 400px) 100vw, 400px" /></p>
<p>根据cat_id字段进行分组，把具有相同cat_id的title字段值连接在一起。</p>
<p><img loading="lazy" decoding="async" width="766" height="159" class="wp-image-7750" src="/wp-content/uploads/2018/06/word-image-352.png" srcset="/wp-content/uploads/2018/06/word-image-352.png 766w, /wp-content/uploads/2018/06/word-image-352-300x62.png 300w" sizes="(max-width: 766px) 100vw, 766px" /></p>
<h3>（3）完成角色编辑功能</h3>
<h3>（4）完成角色删除功能</h3>
<h1>实现不同用户登录展示不同后台菜单</h1>
<h1>八、权限防翻墙</h1>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7682.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP5 商城（二）RBAC、权限增删改查、角色增删改查、不同用户显示不同后台、权限防翻墙</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7751.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7751.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 09 Jun 2018 00:39:13 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[RBAC]]></category>
		<category><![CDATA[不同用户显示不同后台]]></category>
		<category><![CDATA[权限增删改查]]></category>
		<category><![CDATA[权限防翻墙]]></category>
		<category><![CDATA[角色增删改查]]></category>
		<guid isPermaLink="false">/?p=7751</guid>

					<description><![CDATA[一、RBAC功能实现 权限表的curd操作 （1）完成权限的添加 步骤1：在后台建立一个Auth控制器，并建立 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>一、RBAC功能实现</h1>
<h2>权限表的curd操作</h2>
<h3>（1）完成权限的添加</h3>
<p>步骤1：在后台建立一个Auth控制器，并建立一个add方法，输出模板内容，并完成添加权限的实现</p>
<p><img loading="lazy" decoding="async" width="1028" height="717" class="wp-image-7825" src="/wp-content/uploads/2018/06/word-image-424.png" srcset="/wp-content/uploads/2018/06/word-image-424.png 1028w, /wp-content/uploads/2018/06/word-image-424-300x209.png 300w, /wp-content/uploads/2018/06/word-image-424-768x536.png 768w, /wp-content/uploads/2018/06/word-image-424-1024x714.png 1024w" sizes="(max-width: 1028px) 100vw, 1028px" /></p>
<p>同时在Auth模型中取出权限的无限级分类数据：</p>
<p><img loading="lazy" decoding="async" width="965" height="680" class="wp-image-7826" src="/wp-content/uploads/2018/06/word-image-425.png" srcset="/wp-content/uploads/2018/06/word-image-425.png 965w, /wp-content/uploads/2018/06/word-image-425-300x211.png 300w, /wp-content/uploads/2018/06/word-image-425-768x541.png 768w" sizes="(max-width: 965px) 100vw, 965px" /></p>
<p>步骤2：设置add.html模板内容</p>
<p><img loading="lazy" decoding="async" width="1230" height="699" class="wp-image-7827" src="/wp-content/uploads/2018/06/word-image-426.png" srcset="/wp-content/uploads/2018/06/word-image-426.png 1230w, /wp-content/uploads/2018/06/word-image-426-300x170.png 300w, /wp-content/uploads/2018/06/word-image-426-768x436.png 768w, /wp-content/uploads/2018/06/word-image-426-1024x582.png 1024w" sizes="(max-width: 1230px) 100vw, 1230px" /></p>
<p>当选择顶级权限时，控制器名和方法名不可用，否则可用。因为顶级权限没有控制器名和方法名。</p>
<p><img loading="lazy" decoding="async" width="1179" height="481" class="wp-image-7828" src="/wp-content/uploads/2018/06/word-image-427.png" srcset="/wp-content/uploads/2018/06/word-image-427.png 1179w, /wp-content/uploads/2018/06/word-image-427-300x122.png 300w, /wp-content/uploads/2018/06/word-image-427-768x313.png 768w, /wp-content/uploads/2018/06/word-image-427-1024x418.png 1024w" sizes="(max-width: 1179px) 100vw, 1179px" /></p>
<p>注意：表单input设置disabled和readonly的区别</p>
<p>相同点：都不可以编辑input中的数据</p>
<p>不同点：设置disabled时，php中通过$_POST接收不到input框name的属性值</p>
<p>设置readonly时，php中通过$_POST可以收到input的name的属性值</p>
<p>步骤3：定义Auth验证器，进行验证</p>
<p><img loading="lazy" decoding="async" width="773" height="636" class="wp-image-7829" src="/wp-content/uploads/2018/06/word-image-428.png" srcset="/wp-content/uploads/2018/06/word-image-428.png 773w, /wp-content/uploads/2018/06/word-image-428-300x247.png 300w, /wp-content/uploads/2018/06/word-image-428-768x632.png 768w" sizes="(max-width: 773px) 100vw, 773px" /></p>
<p>模板效果：</p>
<p><img loading="lazy" decoding="async" width="542" height="323" class="wp-image-7830" src="/wp-content/uploads/2018/06/word-image-429.png" srcset="/wp-content/uploads/2018/06/word-image-429.png 542w, /wp-content/uploads/2018/06/word-image-429-300x180.png 300w" sizes="(max-width: 542px) 100vw, 542px" /></p>
<h3>完成权限的列表展示</h3>
<p>步骤1：在后台的Auth控制器中建立一个index方法，取出所有的权限数据，分配到模板中。</p>
<p><img loading="lazy" decoding="async" width="1021" height="355" class="wp-image-7832" src="/wp-content/uploads/2018/06/word-image-430.png" srcset="/wp-content/uploads/2018/06/word-image-430.png 1021w, /wp-content/uploads/2018/06/word-image-430-300x104.png 300w, /wp-content/uploads/2018/06/word-image-430-768x267.png 768w" sizes="(max-width: 1021px) 100vw, 1021px" /></p>
<p>注：需要指定getAuthsSon方法返回的结果下标值：</p>
<p><img loading="lazy" decoding="async" width="994" height="413" class="wp-image-7833" src="/wp-content/uploads/2018/06/word-image-431.png" srcset="/wp-content/uploads/2018/06/word-image-431.png 994w, /wp-content/uploads/2018/06/word-image-431-300x125.png 300w, /wp-content/uploads/2018/06/word-image-431-768x319.png 768w" sizes="(max-width: 994px) 100vw, 994px" /></p>
<p>步骤：模板中遍历数据</p>
<p><img loading="lazy" decoding="async" width="1267" height="529" class="wp-image-7834" src="/wp-content/uploads/2018/06/word-image-432.png" srcset="/wp-content/uploads/2018/06/word-image-432.png 1267w, /wp-content/uploads/2018/06/word-image-432-300x125.png 300w, /wp-content/uploads/2018/06/word-image-432-768x321.png 768w, /wp-content/uploads/2018/06/word-image-432-1024x428.png 1024w" sizes="(max-width: 1267px) 100vw, 1267px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="967" height="329" class="wp-image-7835" src="/wp-content/uploads/2018/06/word-image-433.png" srcset="/wp-content/uploads/2018/06/word-image-433.png 967w, /wp-content/uploads/2018/06/word-image-433-300x102.png 300w, /wp-content/uploads/2018/06/word-image-433-768x261.png 768w" sizes="(max-width: 967px) 100vw, 967px" /></p>
<h3>完成权限的编辑</h3>
<p>编辑一个角色注意的地方：</p>
<p>a、不能以当前分类作为父权限 b.不能以当前子孙作为父权限</p>
<p>步骤1：修改编辑的链接地址</p>
<p><img loading="lazy" decoding="async" width="1155" height="428" class="wp-image-7836" src="/wp-content/uploads/2018/06/word-image-434.png" srcset="/wp-content/uploads/2018/06/word-image-434.png 1155w, /wp-content/uploads/2018/06/word-image-434-300x111.png 300w, /wp-content/uploads/2018/06/word-image-434-768x285.png 768w, /wp-content/uploads/2018/06/word-image-434-1024x379.png 1024w" sizes="(max-width: 1155px) 100vw, 1155px" /></p>
<p>步骤2：在Auth控制器建立一个upd的完成编辑功能</p>
<p><img loading="lazy" decoding="async" width="1056" height="699" class="wp-image-7837" src="/wp-content/uploads/2018/06/word-image-435.png" srcset="/wp-content/uploads/2018/06/word-image-435.png 1056w, /wp-content/uploads/2018/06/word-image-435-300x199.png 300w, /wp-content/uploads/2018/06/word-image-435-768x508.png 768w, /wp-content/uploads/2018/06/word-image-435-1024x678.png 1024w" sizes="(max-width: 1056px) 100vw, 1056px" /></p>
<p>步骤3：模板回显数据</p>
<p><img loading="lazy" decoding="async" width="1262" height="673" class="wp-image-7838" src="/wp-content/uploads/2018/06/word-image-436.png" srcset="/wp-content/uploads/2018/06/word-image-436.png 1262w, /wp-content/uploads/2018/06/word-image-436-300x160.png 300w, /wp-content/uploads/2018/06/word-image-436-768x410.png 768w, /wp-content/uploads/2018/06/word-image-436-1024x546.png 1024w" sizes="(max-width: 1262px) 100vw, 1262px" /> <img loading="lazy" decoding="async" width="1189" height="503" class="wp-image-7839" src="/wp-content/uploads/2018/06/word-image-437.png" srcset="/wp-content/uploads/2018/06/word-image-437.png 1189w, /wp-content/uploads/2018/06/word-image-437-300x127.png 300w, /wp-content/uploads/2018/06/word-image-437-768x325.png 768w, /wp-content/uploads/2018/06/word-image-437-1024x433.png 1024w" sizes="(max-width: 1189px) 100vw, 1189px" /></p>
<p>步骤4：需要考虑编辑注意的地方</p>
<p>a、不能以当前分类作为父权限 b.不能以当前子孙作为父权限</p>
<p><img loading="lazy" decoding="async" width="671" height="258" class="wp-image-7840" src="/wp-content/uploads/2018/06/word-image-438.png" srcset="/wp-content/uploads/2018/06/word-image-438.png 671w, /wp-content/uploads/2018/06/word-image-438-300x115.png 300w" sizes="(max-width: 671px) 100vw, 671px" /></p>
<p>解决办法：通过js递归实现，把当前权限以及子孙权限给删除即可。</p>
<p><img loading="lazy" decoding="async" width="1249" height="301" class="wp-image-7841" src="/wp-content/uploads/2018/06/word-image-439.png" srcset="/wp-content/uploads/2018/06/word-image-439.png 1249w, /wp-content/uploads/2018/06/word-image-439-300x72.png 300w, /wp-content/uploads/2018/06/word-image-439-768x185.png 768w, /wp-content/uploads/2018/06/word-image-439-1024x247.png 1024w" sizes="(max-width: 1249px) 100vw, 1249px" /> <img loading="lazy" decoding="async" width="1108" height="542" class="wp-image-7842" src="/wp-content/uploads/2018/06/word-image-440.png" srcset="/wp-content/uploads/2018/06/word-image-440.png 1108w, /wp-content/uploads/2018/06/word-image-440-300x147.png 300w, /wp-content/uploads/2018/06/word-image-440-768x376.png 768w, /wp-content/uploads/2018/06/word-image-440-1024x501.png 1024w" sizes="(max-width: 1108px) 100vw, 1108px" /></p>
<h3>【作业】完成权限的删除</h3>
<p>自行完成</p>
<p><img loading="lazy" decoding="async" width="603" height="415" class="wp-image-7843" src="/wp-content/uploads/2018/06/word-image-441.png" srcset="/wp-content/uploads/2018/06/word-image-441.png 603w, /wp-content/uploads/2018/06/word-image-441-300x206.png 300w" sizes="(max-width: 603px) 100vw, 603px" /></p>
<p>未考虑子分类 直接删除全部</p>
<h2>角色表的curd操作</h2>
<p><img loading="lazy" decoding="async" width="749" height="293" class="wp-image-7844" src="/wp-content/uploads/2018/06/word-image-442.png" srcset="/wp-content/uploads/2018/06/word-image-442.png 749w, /wp-content/uploads/2018/06/word-image-442-300x117.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p>分析：</p>
<ul>
<li>用户表通过角色字段role_id，找到与其关联的角色表role_id。</li>
<li>角色表通过所拥有的所有权限字段auth_id_list，找到与其关联的权限表的auth_id。</li>
</ul>
<h3>添加角色及分配权限</h3>
<p>步骤1：在后台建立一个Role控制器，并建立一个add方法，获取所有的权限</p>
<p><img loading="lazy" decoding="async" width="1023" height="699" class="wp-image-7845" src="/wp-content/uploads/2018/06/word-image-443.png" srcset="/wp-content/uploads/2018/06/word-image-443.png 1023w, /wp-content/uploads/2018/06/word-image-443-300x205.png 300w, /wp-content/uploads/2018/06/word-image-443-768x525.png 768w" sizes="(max-width: 1023px) 100vw, 1023px" /></p>
<p>我们这里取出所有的权限需要一定技巧，两个：</p>
<p>技巧一：取出所有的权限：并且以auth_id为每个元素的下标。</p>
<p>技巧二：取出所有的权限，通过pid进行分组，把具有相同的pid划分为同一组</p>
<p>其中上面变量$auths和$children的打印结果如下：</p>
<p><img loading="lazy" decoding="async" width="337" height="285" class="wp-image-7846" src="/wp-content/uploads/2018/06/word-image-444.png" srcset="/wp-content/uploads/2018/06/word-image-444.png 337w, /wp-content/uploads/2018/06/word-image-444-300x254.png 300w" sizes="(max-width: 337px) 100vw, 337px" /></p>
<p>其中pid=0,有两个元素即auth_id为46和49。其他以此类推。</p>
<p><img loading="lazy" decoding="async" width="479" height="270" class="wp-image-7847" src="/wp-content/uploads/2018/06/word-image-445.png" srcset="/wp-content/uploads/2018/06/word-image-445.png 479w, /wp-content/uploads/2018/06/word-image-445-300x169.png 300w" sizes="(max-width: 479px) 100vw, 479px" /></p>
<p>步骤2：模板中遍历权限，这里需要参考课件的权限布局文件：</p>
<p><img loading="lazy" decoding="async" width="442" height="67" class="wp-image-7848" src="/wp-content/uploads/2018/06/word-image-446.png" srcset="/wp-content/uploads/2018/06/word-image-446.png 442w, /wp-content/uploads/2018/06/word-image-446-300x45.png 300w" sizes="(max-width: 442px) 100vw, 442px" /></p>
<p>注意：如下一级中有个二级，二级中有三级、</p>
<p><img loading="lazy" decoding="async" width="520" height="106" class="wp-image-7849" src="/wp-content/uploads/2018/06/word-image-447.png" srcset="/wp-content/uploads/2018/06/word-image-447.png 520w, /wp-content/uploads/2018/06/word-image-447-300x61.png 300w" sizes="(max-width: 520px) 100vw, 520px" /> <img loading="lazy" decoding="async" width="1298" height="691" class="wp-image-7850" src="/wp-content/uploads/2018/06/word-image-448.png" srcset="/wp-content/uploads/2018/06/word-image-448.png 1298w, /wp-content/uploads/2018/06/word-image-448-300x160.png 300w, /wp-content/uploads/2018/06/word-image-448-768x409.png 768w, /wp-content/uploads/2018/06/word-image-448-1024x545.png 1024w" sizes="(max-width: 1298px) 100vw, 1298px" /></p>
<p>结果如下：</p>
<p><img loading="lazy" decoding="async" width="680" height="312" class="wp-image-7851" src="/wp-content/uploads/2018/06/word-image-449.png" srcset="/wp-content/uploads/2018/06/word-image-449.png 680w, /wp-content/uploads/2018/06/word-image-449-300x138.png 300w" sizes="(max-width: 680px) 100vw, 680px" /></p>
<p>步骤3：进行添加权限入库</p>
<p><img loading="lazy" decoding="async" width="966" height="529" class="wp-image-7852" src="/wp-content/uploads/2018/06/word-image-450.png" srcset="/wp-content/uploads/2018/06/word-image-450.png 966w, /wp-content/uploads/2018/06/word-image-450-300x164.png 300w, /wp-content/uploads/2018/06/word-image-450-768x421.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<p>同时给表角色表添加模型和验证器</p>
<p>模型：</p>
<p><img loading="lazy" decoding="async" width="842" height="401" class="wp-image-7853" src="/wp-content/uploads/2018/06/word-image-451.png" srcset="/wp-content/uploads/2018/06/word-image-451.png 842w, /wp-content/uploads/2018/06/word-image-451-300x143.png 300w, /wp-content/uploads/2018/06/word-image-451-768x366.png 768w" sizes="(max-width: 842px) 100vw, 842px" /></p>
<p>验证器：</p>
<p><img loading="lazy" decoding="async" width="707" height="519" class="wp-image-7854" src="/wp-content/uploads/2018/06/word-image-452.png" srcset="/wp-content/uploads/2018/06/word-image-452.png 707w, /wp-content/uploads/2018/06/word-image-452-300x220.png 300w" sizes="(max-width: 707px) 100vw, 707px" /></p>
<p>数据库存储的格式：</p>
<p><img loading="lazy" decoding="async" width="667" height="118" class="wp-image-7855" src="/wp-content/uploads/2018/06/word-image-453.png" srcset="/wp-content/uploads/2018/06/word-image-453.png 667w, /wp-content/uploads/2018/06/word-image-453-300x53.png 300w" sizes="(max-width: 667px) 100vw, 667px" /></p>
<p>注：一般系统角色名为超级管理员都会拥有所有的权限，其权限字段auth_id_list可以手动设置为*。</p>
<h3>（2）完成添加权限分配的特效操作</h3>
<p>role/add.html模板文件：</p>
<p><img loading="lazy" decoding="async" width="1326" height="697" class="wp-image-7856" src="/wp-content/uploads/2018/06/word-image-454.png" srcset="/wp-content/uploads/2018/06/word-image-454.png 1326w, /wp-content/uploads/2018/06/word-image-454-300x158.png 300w, /wp-content/uploads/2018/06/word-image-454-768x404.png 768w, /wp-content/uploads/2018/06/word-image-454-1024x538.png 1024w" sizes="(max-width: 1326px) 100vw, 1326px" /></p>
<p>特效代码：</p>
<p><img loading="lazy" decoding="async" width="912" height="488" class="wp-image-7857" src="/wp-content/uploads/2018/06/word-image-455.png" srcset="/wp-content/uploads/2018/06/word-image-455.png 912w, /wp-content/uploads/2018/06/word-image-455-300x161.png 300w, /wp-content/uploads/2018/06/word-image-455-768x411.png 768w" sizes="(max-width: 912px) 100vw, 912px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="703" height="336" class="wp-image-7858" src="/wp-content/uploads/2018/06/word-image-456.png" srcset="/wp-content/uploads/2018/06/word-image-456.png 703w, /wp-content/uploads/2018/06/word-image-456-300x143.png 300w" sizes="(max-width: 703px) 100vw, 703px" /></p>
<h3>（3）【重要】小结</h3>
<ol>
<li>记住，以后去公司做有关权限分配的时候，可以直接参考以下的模板布局</li>
</ol>
<p><img loading="lazy" decoding="async" width="686" height="76" class="wp-image-7859" src="/wp-content/uploads/2018/06/word-image-457.png" srcset="/wp-content/uploads/2018/06/word-image-457.png 686w, /wp-content/uploads/2018/06/word-image-457-300x33.png 300w" sizes="(max-width: 686px) 100vw, 686px" /></p>
<p>b、以后在模板中凡是需要取出含有（父子孙）层级关系的数据，可以使用下面这个技巧。</p>
<p>技巧一：取出所有的权限：并且以auth_id为每个元素的下标。</p>
<p>技巧二：取出所有的权限，通过pid进行分组，把具有相同的pid划分为同一组</p>
<p>此技巧的典型使用场景有：</p>
<ol>
<li>如遍历权限可以用到，上面代码就是。</li>
</ol>
<p><img loading="lazy" decoding="async" width="617" height="128" class="wp-image-7860" src="/wp-content/uploads/2018/06/word-image-458.png" srcset="/wp-content/uploads/2018/06/word-image-458.png 617w, /wp-content/uploads/2018/06/word-image-458-300x62.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></p>
<ol>
<li>如京东商城遍历三级分类菜单</li>
</ol>
<p><img loading="lazy" decoding="async" width="839" height="53" class="wp-image-7861" src="/wp-content/uploads/2018/06/word-image-459.png" srcset="/wp-content/uploads/2018/06/word-image-459.png 839w, /wp-content/uploads/2018/06/word-image-459-300x19.png 300w, /wp-content/uploads/2018/06/word-image-459-768x49.png 768w" sizes="(max-width: 839px) 100vw, 839px" /></p>
<p>3、分类菜单的折叠</p>
<p><img loading="lazy" decoding="async" width="230" height="342" class="wp-image-7862" src="/wp-content/uploads/2018/06/word-image-460.png" srcset="/wp-content/uploads/2018/06/word-image-460.png 230w, /wp-content/uploads/2018/06/word-image-460-202x300.png 202w" sizes="(max-width: 230px) 100vw, 230px" /></p>
<h3>（4）角色的列表展示</h3>
<p>把一个角色所拥有的权限都查出来，这里需要利用到两个mysql函数：</p>
<p>FIND_IN_SET和group_concat(字段)</p>
<ul>
<li>FIND_IN_SET(str,strlist) :</li>
</ul>
<p>作用：查询出子串str，是否在由逗号分隔的目标字符串strlist中存在。</p>
<p>如：判断5是否在字符串1,2,3,4,5中存在：FIND_IN_SET(5,‘1,2,3,4,5’) ，存在则返回所在目标字符串strlist的所在位置，不存在则返回0。</p>
<p>执行函数mysql函数： select 函数名();</p>
<p><img loading="lazy" decoding="async" width="643" height="83" class="wp-image-7863" src="/wp-content/uploads/2018/06/word-image-461.png" srcset="/wp-content/uploads/2018/06/word-image-461.png 643w, /wp-content/uploads/2018/06/word-image-461-300x39.png 300w" sizes="(max-width: 643px) 100vw, 643px" /> <img loading="lazy" decoding="async" width="476" height="77" class="wp-image-7864" src="/wp-content/uploads/2018/06/word-image-462.png" srcset="/wp-content/uploads/2018/06/word-image-462.png 476w, /wp-content/uploads/2018/06/word-image-462-300x49.png 300w" sizes="(max-width: 476px) 100vw, 476px" /></p>
<ul>
<li>group_concat(字段)</li>
</ul>
<p>作用：主要根据某个字段进行分组，把相同字段的值连接在一起。</p>
<p>默认连接符号是逗号 ，如果用|连接则：</p>
<p>group_concat(字段名 SEPARATOR “|”)</p>
<p>例：如下是表tp_article表中的一些数据</p>
<p><img loading="lazy" decoding="async" width="400" height="150" class="wp-image-7865" src="/wp-content/uploads/2018/06/word-image-463.png" srcset="/wp-content/uploads/2018/06/word-image-463.png 400w, /wp-content/uploads/2018/06/word-image-463-300x113.png 300w" sizes="(max-width: 400px) 100vw, 400px" /></p>
<p>根据cat_id字段进行分组，把具有相同cat_id的title字段值连接在一起。</p>
<p><img loading="lazy" decoding="async" width="766" height="159" class="wp-image-7866" src="/wp-content/uploads/2018/06/word-image-464.png" srcset="/wp-content/uploads/2018/06/word-image-464.png 766w, /wp-content/uploads/2018/06/word-image-464-300x62.png 300w" sizes="(max-width: 766px) 100vw, 766px" /></p>
<p>查询出当前角色所拥有的全部权限拼接在一起：</p>
<p><img loading="lazy" decoding="async" width="1117" height="403" class="wp-image-7867" src="/wp-content/uploads/2018/06/word-image-465.png" srcset="/wp-content/uploads/2018/06/word-image-465.png 1117w, /wp-content/uploads/2018/06/word-image-465-300x108.png 300w, /wp-content/uploads/2018/06/word-image-465-768x277.png 768w, /wp-content/uploads/2018/06/word-image-465-1024x369.png 1024w" sizes="(max-width: 1117px) 100vw, 1117px" /></p>
<h3>完成角色编辑功能（给角色分配权限）</h3>
<p>步骤1：修改role/index.html的链接地址</p>
<p><img loading="lazy" decoding="async" width="1283" height="476" class="wp-image-7868" src="/wp-content/uploads/2018/06/word-image-466.png" srcset="/wp-content/uploads/2018/06/word-image-466.png 1283w, /wp-content/uploads/2018/06/word-image-466-300x111.png 300w, /wp-content/uploads/2018/06/word-image-466-768x285.png 768w, /wp-content/uploads/2018/06/word-image-466-1024x380.png 1024w" sizes="(max-width: 1283px) 100vw, 1283px" /></p>
<p>步骤2：在admin-RoleController-upd的方法中完成数据的回显到模板中</p>
<p>注意： 模块-控制器-方法</p>
<p><img loading="lazy" decoding="async" width="879" height="699" class="wp-image-7869" src="/wp-content/uploads/2018/06/word-image-467.png" srcset="/wp-content/uploads/2018/06/word-image-467.png 879w, /wp-content/uploads/2018/06/word-image-467-300x239.png 300w, /wp-content/uploads/2018/06/word-image-467-768x611.png 768w" sizes="(max-width: 879px) 100vw, 879px" /></p>
<p>步骤3：复制添加角色的add.html模板即可，改名为html.进行回显数据和把角色已有的权限默认选中</p>
<p><img loading="lazy" decoding="async" width="1122" height="620" class="wp-image-7870" src="/wp-content/uploads/2018/06/word-image-468.png" srcset="/wp-content/uploads/2018/06/word-image-468.png 1122w, /wp-content/uploads/2018/06/word-image-468-300x166.png 300w, /wp-content/uploads/2018/06/word-image-468-768x424.png 768w, /wp-content/uploads/2018/06/word-image-468-1024x566.png 1024w" sizes="(max-width: 1122px) 100vw, 1122px" /></p>
<p>已有权限默认选中：</p>
<p><img loading="lazy" decoding="async" width="1160" height="587" class="wp-image-7871" src="/wp-content/uploads/2018/06/word-image-469.png" srcset="/wp-content/uploads/2018/06/word-image-469.png 1160w, /wp-content/uploads/2018/06/word-image-469-300x152.png 300w, /wp-content/uploads/2018/06/word-image-469-768x389.png 768w, /wp-content/uploads/2018/06/word-image-469-1024x518.png 1024w" sizes="(max-width: 1160px) 100vw, 1160px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="661" height="295" class="wp-image-7872" src="/wp-content/uploads/2018/06/word-image-470.png" srcset="/wp-content/uploads/2018/06/word-image-470.png 661w, /wp-content/uploads/2018/06/word-image-470-300x134.png 300w" sizes="(max-width: 661px) 100vw, 661px" /></p>
<h3>（6）【作业】完成角色删除功能</h3>
<p>自行完成</p>
<p><img loading="lazy" decoding="async" width="636" height="397" class="wp-image-7873" src="/wp-content/uploads/2018/06/word-image-471.png" srcset="/wp-content/uploads/2018/06/word-image-471.png 636w, /wp-content/uploads/2018/06/word-image-471-300x187.png 300w" sizes="(max-width: 636px) 100vw, 636px" /></p>
<h3>（7）添加用户分配权限</h3>
<p>步骤1：修改admin-view-user-add.html模板内容，加一个显示角色的下拉框</p>
<h1>实现不同用户登录展示不同后台菜单</h1>
<h2>思路</h2>
<p><img loading="lazy" decoding="async" width="848" height="291" class="wp-image-7874" src="/wp-content/uploads/2018/06/word-image-472.png" srcset="/wp-content/uploads/2018/06/word-image-472.png 848w, /wp-content/uploads/2018/06/word-image-472-300x103.png 300w, /wp-content/uploads/2018/06/word-image-472-768x264.png 768w" sizes="(max-width: 848px) 100vw, 848px" /></p>
<ol>
<li>用户登录成功的时候，获取到role_id。</li>
<li>通过role_id获取角色表的auth_id_list字段</li>
<li>通过权限表auth_id 只要在auth_id_list字段存在即可，查出所拥有的权限</li>
</ol>
<p>超级管理员auth_id_list字段的值为*，代表拥有后台操作的所有权限。</p>
<h2>代码实现</h2>
<p>步骤1：在用户登录成功的模型的checkUser方法中，通过角色id把当前角色所有的权限写入到session。</p>
<p><img loading="lazy" decoding="async" width="973" height="627" class="wp-image-7875" src="/wp-content/uploads/2018/06/word-image-473.png" srcset="/wp-content/uploads/2018/06/word-image-473.png 973w, /wp-content/uploads/2018/06/word-image-473-300x193.png 300w, /wp-content/uploads/2018/06/word-image-473-768x495.png 768w" sizes="(max-width: 973px) 100vw, 973px" /></p>
<p>步骤2：定义user模型中定义writeAuthToSession方法把权限写入到session中</p>
<p>注：后台left.html模板文件中，只需要显示一级和二级的权限即可：</p>
<p>我们需要构造出一个特定数据结构的数据：</p>
<p>如下：通过每个顶级（pid=0）的元素加个一个sonsAuth下标存储其对应的子级权限</p>
<p>[</p>
<p>auth_name=&gt;‘用户管理’</p>
<p>auth_id =&gt;46</p>
<p>pid =&gt; 0</p>
<p>&#8230;&#8230;</p>
<p>sonsAuth=&gt;[</p>
<p>[auth_name=&gt;用户列表,’pid’=&gt;46]</p>
<p>[auth_name=&gt;用户添加,’pid’=&gt;46]</p>
<p>&#8230;..</p>
<p>]</p>
<p>]</p>
<p>超级管理员：</p>
<p><img loading="lazy" decoding="async" width="1265" height="387" class="wp-image-7876" src="/wp-content/uploads/2018/06/word-image-474.png" srcset="/wp-content/uploads/2018/06/word-image-474.png 1265w, /wp-content/uploads/2018/06/word-image-474-300x92.png 300w, /wp-content/uploads/2018/06/word-image-474-768x235.png 768w, /wp-content/uploads/2018/06/word-image-474-1024x313.png 1024w" sizes="(max-width: 1265px) 100vw, 1265px" /></p>
<p>非超级管理员：</p>
<p><img loading="lazy" decoding="async" width="1163" height="577" class="wp-image-7877" src="/wp-content/uploads/2018/06/word-image-475.png" srcset="/wp-content/uploads/2018/06/word-image-475.png 1163w, /wp-content/uploads/2018/06/word-image-475-300x149.png 300w, /wp-content/uploads/2018/06/word-image-475-768x381.png 768w, /wp-content/uploads/2018/06/word-image-475-1024x508.png 1024w" sizes="(max-width: 1163px) 100vw, 1163px" /></p>
<p>步骤3：在left.html取出session中的权限，遍历访问的菜单</p>
<p><img loading="lazy" decoding="async" width="1235" height="668" class="wp-image-7878" src="/wp-content/uploads/2018/06/word-image-476.png" srcset="/wp-content/uploads/2018/06/word-image-476.png 1235w, /wp-content/uploads/2018/06/word-image-476-300x162.png 300w, /wp-content/uploads/2018/06/word-image-476-768x415.png 768w, /wp-content/uploads/2018/06/word-image-476-1024x554.png 1024w" sizes="(max-width: 1235px) 100vw, 1235px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="219" height="159" class="wp-image-7879" src="/wp-content/uploads/2018/06/word-image-477.png" /></p>
<h1>权限防翻墙</h1>
<p>如下：</p>
<p><img loading="lazy" decoding="async" width="1347" height="258" class="wp-image-7880" src="/wp-content/uploads/2018/06/word-image-478.png" srcset="/wp-content/uploads/2018/06/word-image-478.png 1347w, /wp-content/uploads/2018/06/word-image-478-300x57.png 300w, /wp-content/uploads/2018/06/word-image-478-768x147.png 768w, /wp-content/uploads/2018/06/word-image-478-1024x196.png 1024w" sizes="(max-width: 1347px) 100vw, 1347px" /></p>
<p>解决办法：在common控制器中的_initialize的方法中，做防翻墙的操作。</p>
<p>1、要先获取到用户所访问的控制器名和方法名，在去做相关判断是否有权限</p>
<p><img loading="lazy" decoding="async" width="1111" height="626" class="wp-image-7881" src="/wp-content/uploads/2018/06/word-image-479.png" srcset="/wp-content/uploads/2018/06/word-image-479.png 1111w, /wp-content/uploads/2018/06/word-image-479-300x169.png 300w, /wp-content/uploads/2018/06/word-image-479-768x433.png 768w, /wp-content/uploads/2018/06/word-image-479-1024x577.png 1024w" sizes="(max-width: 1111px) 100vw, 1111px" /></p>
<ol>
<li>把用户可以访问的权限存储在session中</li>
</ol>
<p>超级管理员：</p>
<p><img loading="lazy" decoding="async" width="1240" height="517" class="wp-image-7882" src="/wp-content/uploads/2018/06/word-image-480.png" srcset="/wp-content/uploads/2018/06/word-image-480.png 1240w, /wp-content/uploads/2018/06/word-image-480-300x125.png 300w, /wp-content/uploads/2018/06/word-image-480-768x320.png 768w, /wp-content/uploads/2018/06/word-image-480-1024x427.png 1024w" sizes="(max-width: 1240px) 100vw, 1240px" /></p>
<p>非超级管理员：</p>
<p><img loading="lazy" decoding="async" width="998" height="625" class="wp-image-7883" src="/wp-content/uploads/2018/06/word-image-481.png" srcset="/wp-content/uploads/2018/06/word-image-481.png 998w, /wp-content/uploads/2018/06/word-image-481-300x188.png 300w, /wp-content/uploads/2018/06/word-image-481-768x481.png 768w" sizes="(max-width: 998px) 100vw, 998px" /></p>
<p>今天重点：</p>
<ol>
<li>一张牛逼的图</li>
<li>怎么构造满足我们要求的数组结构数据</li>
</ol>
<h1>四、商品有关的基本概念</h1>
<p>这里主要涉及到以下几个概念：</p>
<ul>
<li>商品类型：不同的网站的卖的商品是不一样的，比如化妆品网站专门卖化妆品、手机网站专门卖手机、汽车网站专门卖汽车。</li>
<li>商品属性：不同的商品类型对应的商品属性也是不一样的。</li>
</ul>
<p>比如卖汽车网站，商品(汽车)属性有轴距、变速箱、驱动方式、进气方式、排量等</p>
<p>比如卖电脑网站，商品（电脑）属性有尺寸、内存、cpu、操作系统、系统核数等</p>
<p>比如卖手机网站，商品（手机）属性有尺寸、内存、系统、颜色、网络类型、电池容量等</p>
<p>商品类型决定了商品属性</p>
<ul>
<li>商品分类</li>
</ul>
<p>一个电商网站卖的商品不一样，其商品分类也是不一样的。</p>
<p>比如：卖汽车分类有：国产（吉利、 广汽）、日产(本田、丰田)、德国（奔驰、宝马）、韩国（起亚、现代）。</p>
<p>比如：卖手机分类有: 小米、华为、三星、苹果、oppo、vivo、魅族。</p>
<ul>
<li>商品（产品+属性=商品）</li>
</ul>
<p>如：iphoneX+64G , iphoneX+256G</p>
<h3>商品类型</h3>
<p>不同的商品类型会有不同的属性</p>
<p>可以在ecshop后台中新建一个商品类型，如下：建立一个汽车商品类型</p>
<p><img loading="lazy" decoding="async" width="1344" height="238" class="wp-image-7884" src="/wp-content/uploads/2018/06/word-image-482.png" srcset="/wp-content/uploads/2018/06/word-image-482.png 1344w, /wp-content/uploads/2018/06/word-image-482-300x53.png 300w, /wp-content/uploads/2018/06/word-image-482-768x136.png 768w, /wp-content/uploads/2018/06/word-image-482-1024x181.png 1024w" sizes="(max-width: 1344px) 100vw, 1344px" /> <img loading="lazy" decoding="async" width="797" height="395" class="wp-image-7885" src="/wp-content/uploads/2018/06/word-image-483.png" srcset="/wp-content/uploads/2018/06/word-image-483.png 797w, /wp-content/uploads/2018/06/word-image-483-300x149.png 300w, /wp-content/uploads/2018/06/word-image-483-768x381.png 768w" sizes="(max-width: 797px) 100vw, 797px" /></p>
<p>属性分组：有些属性是可以归为一组的，参考京东电脑商品：</p>
<p><img loading="lazy" decoding="async" width="546" height="381" class="wp-image-7886" src="/wp-content/uploads/2018/06/word-image-484.png" srcset="/wp-content/uploads/2018/06/word-image-484.png 546w, /wp-content/uploads/2018/06/word-image-484-300x209.png 300w" sizes="(max-width: 546px) 100vw, 546px" /></p>
<h3>商品属性</h3>
<p>给商品类型添加商品属性： 商品类型&#8211;&gt;属性列表：</p>
<p><img loading="lazy" decoding="async" width="1147" height="34" class="wp-image-7887" src="/wp-content/uploads/2018/06/word-image-485.png" srcset="/wp-content/uploads/2018/06/word-image-485.png 1147w, /wp-content/uploads/2018/06/word-image-485-300x9.png 300w, /wp-content/uploads/2018/06/word-image-485-768x23.png 768w, /wp-content/uploads/2018/06/word-image-485-1024x30.png 1024w" sizes="(max-width: 1147px) 100vw, 1147px" /> <img loading="lazy" decoding="async" width="1142" height="200" class="wp-image-7888" src="/wp-content/uploads/2018/06/word-image-486.png" srcset="/wp-content/uploads/2018/06/word-image-486.png 1142w, /wp-content/uploads/2018/06/word-image-486-300x53.png 300w, /wp-content/uploads/2018/06/word-image-486-768x135.png 768w, /wp-content/uploads/2018/06/word-image-486-1024x179.png 1024w" sizes="(max-width: 1142px) 100vw, 1142px" /></p>
<p>给汽车类型商品添加进气方式的属性：</p>
<p><img loading="lazy" decoding="async" width="658" height="419" class="wp-image-7889" src="/wp-content/uploads/2018/06/word-image-487.png" srcset="/wp-content/uploads/2018/06/word-image-487.png 658w, /wp-content/uploads/2018/06/word-image-487-300x191.png 300w" sizes="(max-width: 658px) 100vw, 658px" /></p>
<p>单选属性： 指买商品的时候，可以选择一个属性，不同的属性价格不一样</p>
<p><img loading="lazy" decoding="async" width="676" height="145" class="wp-image-7890" src="/wp-content/uploads/2018/06/word-image-488.png" srcset="/wp-content/uploads/2018/06/word-image-488.png 676w, /wp-content/uploads/2018/06/word-image-488-300x64.png 300w" sizes="(max-width: 676px) 100vw, 676px" /></p>
<p>唯一属性：只能看不能选。</p>
<p><img loading="lazy" decoding="async" width="802" height="232" class="wp-image-7891" src="/wp-content/uploads/2018/06/word-image-489.png" srcset="/wp-content/uploads/2018/06/word-image-489.png 802w, /wp-content/uploads/2018/06/word-image-489-300x87.png 300w, /wp-content/uploads/2018/06/word-image-489-768x222.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></p>
<p>复选属性：可以选择多个，一般买商品的附加配件都是复选的。</p>
<p><img loading="lazy" decoding="async" width="1016" height="261" class="wp-image-7892" src="/wp-content/uploads/2018/06/word-image-490.png" srcset="/wp-content/uploads/2018/06/word-image-490.png 1016w, /wp-content/uploads/2018/06/word-image-490-300x77.png 300w, /wp-content/uploads/2018/06/word-image-490-768x197.png 768w" sizes="(max-width: 1016px) 100vw, 1016px" /></p>
<p>当在后台添加一个商品的时候要选择一个商品类型，选择了一个商品类型就决定了这个商品的有哪些属性，如下是添加商品设置其商品属性：</p>
<p><img loading="lazy" decoding="async" width="921" height="440" class="wp-image-7893" src="/wp-content/uploads/2018/06/word-image-491.png" srcset="/wp-content/uploads/2018/06/word-image-491.png 921w, /wp-content/uploads/2018/06/word-image-491-300x143.png 300w, /wp-content/uploads/2018/06/word-image-491-768x367.png 768w" sizes="(max-width: 921px) 100vw, 921px" /></p>
<p>添加属性的特点：</p>
<p>唯一属性（只能看，不能选）：前面没有【+】，不可以设置价格</p>
<p>单选属性（可选择）：前面有【+】，点击+即可复制多个，不同的单选属性可设置不同的价格</p>
<p>属性值手工输入：对应的是个input框，需要自己输入。</p>
<p>属性值是列表选择： 对应的是个select下拉框，需选中一个属性值。</p>
<h3>商品分类</h3>
<p>一般一个网站决定卖什么类型商品就决定了其商品分类。</p>
<p>如卖汽车网站：分类有国产、日系、德系、韩系等</p>
<p>如卖化妆品网站：分类洗面奶、乳液、面膜、保湿、祛痘、眼霜等</p>
<p><img loading="lazy" decoding="async" width="1323" height="236" class="wp-image-7894" src="/wp-content/uploads/2018/06/word-image-492.png" srcset="/wp-content/uploads/2018/06/word-image-492.png 1323w, /wp-content/uploads/2018/06/word-image-492-300x54.png 300w, /wp-content/uploads/2018/06/word-image-492-768x137.png 768w, /wp-content/uploads/2018/06/word-image-492-1024x183.png 1024w" sizes="(max-width: 1323px) 100vw, 1323px" /></p>
<h1>五、完成商品类型的curd</h1>
<h2>商品类型介绍</h2>
<p>商品类型：不同的网站的卖的商品类型是不一样的，比如化妆品网站专卖化妆品、手机网站专卖手机、二手汽车网站专买二手汽车。</p>
<p>网站决定卖什么商品类型，也就决定了商品的商品属性</p>
<h2>商品类型的增加</h2>
<h2>商品类型的列表</h2>
<h2>商品类型的编辑</h2>
<h2>【作业】商品类型的删除</h2>
<h1>六、完成商品属性的curd</h1>
<h2>1、商品属性的认识</h2>
<p>网站决定卖什么商品类型，也就决定了商品的商品属性</p>
<p>可以参考ecshop添加属性的方式:</p>
<p><img loading="lazy" decoding="async" width="960" height="427" class="wp-image-7895" src="/wp-content/uploads/2018/06/word-image-493.png" srcset="/wp-content/uploads/2018/06/word-image-493.png 960w, /wp-content/uploads/2018/06/word-image-493-300x133.png 300w, /wp-content/uploads/2018/06/word-image-493-768x342.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p>属性这里重点两种属性：唯一属性和单选属性</p>
<p>唯一属性：只能看，不能选。</p>
<p><img loading="lazy" decoding="async" width="389" height="55" class="wp-image-7896" src="/wp-content/uploads/2018/06/word-image-494.png" srcset="/wp-content/uploads/2018/06/word-image-494.png 389w, /wp-content/uploads/2018/06/word-image-494-300x42.png 300w" sizes="(max-width: 389px) 100vw, 389px" /></p>
<p>单选属性：我们购买商品的时候，可以选择的，后面添加商品的时候，不同的单选属性价格也是不一样的，如iphone6银色和iphone黑色价格是不一样的。</p>
<p><img loading="lazy" decoding="async" width="678" height="186" class="wp-image-7897" src="/wp-content/uploads/2018/06/word-image-495.png" srcset="/wp-content/uploads/2018/06/word-image-495.png 678w, /wp-content/uploads/2018/06/word-image-495-300x82.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<p>②属性的值的录入方式</p>
<p><img loading="lazy" decoding="async" width="643" height="114" class="wp-image-7898" src="/wp-content/uploads/2018/06/word-image-496.png" srcset="/wp-content/uploads/2018/06/word-image-496.png 643w, /wp-content/uploads/2018/06/word-image-496-300x53.png 300w" sizes="(max-width: 643px) 100vw, 643px" /></p>
<p>手工输入：不可以输入属性值，且可选值列表是禁用状态，只能在添加商品的时候输入属性值。</p>
<p>列表选择：在可选择列表输入一些我们指定的属性值，添加商品的时候，从中选中一个属性值即可。</p>
<p>表结构：</p>
<h2>完成商品属性的添加</h2>
<h2>完成商品属性的列表</h2>
<h2>完成商品属性的编辑</h2>
<h2>完成商品属性的删除</h2>
<h2>完成商品类型列表中属性的查看</h2>
<h1>七、完成商品分类的curd</h1>
<h2>1、分析分类表结构</h2>
<p>表字段结构如下：</p>
<h2>完成商品分类的添加</h2>
<h2>完成商品分类的列表</h2>
<h2>4、完成商品分类的编辑</h2>
<h2>5、【作业】完成商品分类的删除</h2>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7751.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP5 商城（三）账户状态权限控制、商品类型 CURD、商品属性 CURD、商品分类 CURD</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7899.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7899.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 09 Jun 2018 00:38:08 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[商品分类 CURD]]></category>
		<category><![CDATA[商品属性 CURD]]></category>
		<category><![CDATA[商品类型 CURD]]></category>
		<category><![CDATA[账户状态权限控制]]></category>
		<guid isPermaLink="false">/?p=7899</guid>

					<description><![CDATA[完善控制账户状态的权限控制 当用户点击下面列表的可用或禁用的功能的时候，ajax返回一个无权限操作。 这是因为 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>完善控制账户状态的权限控制</h1>
<p>当用户点击下面列表的可用或禁用的功能的时候，ajax返回一个无权限操作。</p>
<p>这是因为用户没有此权限，一般只有超级管理员才会有此权限。</p>
<p>所以，我们也可以在后台添加此权限给用户进行分配：</p>
<p><img loading="lazy" decoding="async" width="558" height="375" class="wp-image-7965" src="/wp-content/uploads/2018/06/word-image-560.png" srcset="/wp-content/uploads/2018/06/word-image-560.png 558w, /wp-content/uploads/2018/06/word-image-560-300x202.png 300w" sizes="(max-width: 558px) 100vw, 558px" /></p>
<p>然后给对应的角色分配即可：</p>
<p><img loading="lazy" decoding="async" width="721" height="347" class="wp-image-7966" src="/wp-content/uploads/2018/06/word-image-561.png" srcset="/wp-content/uploads/2018/06/word-image-561.png 721w, /wp-content/uploads/2018/06/word-image-561-300x144.png 300w" sizes="(max-width: 721px) 100vw, 721px" /></p>
<p>同时当某个角色没有此权限的时候，需要在Common控制器中给提示无权限访问：</p>
<p><img loading="lazy" decoding="async" width="1286" height="694" class="wp-image-7967" src="/wp-content/uploads/2018/06/word-image-562.png" srcset="/wp-content/uploads/2018/06/word-image-562.png 1286w, /wp-content/uploads/2018/06/word-image-562-300x162.png 300w, /wp-content/uploads/2018/06/word-image-562-768x414.png 768w, /wp-content/uploads/2018/06/word-image-562-1024x553.png 1024w" sizes="(max-width: 1286px) 100vw, 1286px" /></p>
<p>在ajax中给出提示无权限：</p>
<p><img loading="lazy" decoding="async" width="1210" height="427" class="wp-image-7968" src="/wp-content/uploads/2018/06/word-image-563.png" srcset="/wp-content/uploads/2018/06/word-image-563.png 1210w, /wp-content/uploads/2018/06/word-image-563-300x106.png 300w, /wp-content/uploads/2018/06/word-image-563-768x271.png 768w, /wp-content/uploads/2018/06/word-image-563-1024x361.png 1024w" sizes="(max-width: 1210px) 100vw, 1210px" /></p>
<h1>一、商品有关的基本概念</h1>
<p>这里主要涉及到以下几个概念：</p>
<ul>
<li>商品类型：不同的网站的卖的商品是不一样的，比如化妆品网站专门卖化妆品、手机网站专门卖手机、汽车网站专门卖汽车。</li>
<li>商品属性：不同的商品类型对应的商品属性也是不一样的。</li>
</ul>
<p>比如卖汽车网站，商品(汽车)属性有轴距、变速箱、驱动方式、进气方式、排量等</p>
<p>比如卖电脑网站，商品（电脑）属性有尺寸、内存、cpu、操作系统、系统核数等</p>
<p>比如卖手机网站，商品（手机）属性有尺寸、内存、系统、颜色、网络类型、电池容量等</p>
<p>商品类型决定了商品属性，商品属性依据商品类型走的。</p>
<ul>
<li>商品分类</li>
</ul>
<p>一个电商网站卖的商品不一样，其商品分类也是不一样的。</p>
<p>比如：卖汽车分类有：国产（吉利、 广汽）、日产(本田、丰田)、德国（奔驰、宝马）、韩国（起亚、现代）。</p>
<p>比如：卖手机分类有: 小米、华为、三星、苹果、oppo、vivo、魅族。</p>
<p>比如：卖化妆品有: 补水、祛痘、气垫、BB霜、口红、&#8230;.</p>
<ul>
<li>商品（产品+属性=商品）</li>
<li>商品（产品+属性=商品）</li>
</ul>
<p>如：iphoneX+64G(7888) , iphoneX+256G(9888)</p>
<h2>1、商品类型</h2>
<p>不同的商品类型会有不同的属性</p>
<p>可以在ecshop后台中新建一个商品类型，如下：建立一个手机商品类型</p>
<p><img loading="lazy" decoding="async" width="1344" height="238" class="wp-image-7969" src="/wp-content/uploads/2018/06/word-image-564.png" srcset="/wp-content/uploads/2018/06/word-image-564.png 1344w, /wp-content/uploads/2018/06/word-image-564-300x53.png 300w, /wp-content/uploads/2018/06/word-image-564-768x136.png 768w, /wp-content/uploads/2018/06/word-image-564-1024x181.png 1024w" sizes="(max-width: 1344px) 100vw, 1344px" /></p>
<h2>2、商品属性</h2>
<p>给商品类型添加商品属性： 商品类型&#8211;&gt;属性列表：</p>
<p><img loading="lazy" decoding="async" width="1147" height="34" class="wp-image-7970" src="/wp-content/uploads/2018/06/word-image-565.png" srcset="/wp-content/uploads/2018/06/word-image-565.png 1147w, /wp-content/uploads/2018/06/word-image-565-300x9.png 300w, /wp-content/uploads/2018/06/word-image-565-768x23.png 768w, /wp-content/uploads/2018/06/word-image-565-1024x30.png 1024w" sizes="(max-width: 1147px) 100vw, 1147px" /> <img loading="lazy" decoding="async" width="1159" height="102" class="wp-image-7972" src="/wp-content/uploads/2018/06/word-image-566.png" srcset="/wp-content/uploads/2018/06/word-image-566.png 1159w, /wp-content/uploads/2018/06/word-image-566-300x26.png 300w, /wp-content/uploads/2018/06/word-image-566-768x68.png 768w, /wp-content/uploads/2018/06/word-image-566-1024x90.png 1024w" sizes="(max-width: 1159px) 100vw, 1159px" /></p>
<p>给手机类型商品添加内存的属性：</p>
<p><img loading="lazy" decoding="async" width="665" height="370" class="wp-image-7973" src="/wp-content/uploads/2018/06/word-image-567.png" srcset="/wp-content/uploads/2018/06/word-image-567.png 665w, /wp-content/uploads/2018/06/word-image-567-300x167.png 300w" sizes="(max-width: 665px) 100vw, 665px" /></p>
<p>添加商品属性列表如下：</p>
<p><img loading="lazy" decoding="async" width="955" height="200" class="wp-image-7974" src="/wp-content/uploads/2018/06/word-image-568.png" srcset="/wp-content/uploads/2018/06/word-image-568.png 955w, /wp-content/uploads/2018/06/word-image-568-300x63.png 300w, /wp-content/uploads/2018/06/word-image-568-768x161.png 768w" sizes="(max-width: 955px) 100vw, 955px" /></p>
<p>属性解释：</p>
<p>单选属性： 指买商品的时候，可以选择一个属性，不同的属性价格不一样</p>
<p><img loading="lazy" decoding="async" width="676" height="145" class="wp-image-7975" src="/wp-content/uploads/2018/06/word-image-569.png" srcset="/wp-content/uploads/2018/06/word-image-569.png 676w, /wp-content/uploads/2018/06/word-image-569-300x64.png 300w" sizes="(max-width: 676px) 100vw, 676px" /></p>
<p>唯一属性：只能看不能选。</p>
<p><img loading="lazy" decoding="async" width="802" height="232" class="wp-image-7976" src="/wp-content/uploads/2018/06/word-image-570.png" srcset="/wp-content/uploads/2018/06/word-image-570.png 802w, /wp-content/uploads/2018/06/word-image-570-300x87.png 300w, /wp-content/uploads/2018/06/word-image-570-768x222.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></p>
<p>复选属性：可以选择多个，一般买商品的附加配件都是复选的。</p>
<p><img loading="lazy" decoding="async" width="1016" height="261" class="wp-image-7977" src="/wp-content/uploads/2018/06/word-image-571.png" srcset="/wp-content/uploads/2018/06/word-image-571.png 1016w, /wp-content/uploads/2018/06/word-image-571-300x77.png 300w, /wp-content/uploads/2018/06/word-image-571-768x197.png 768w" sizes="(max-width: 1016px) 100vw, 1016px" /></p>
<h2>3、属性类型和属性录入方式的组合</h2>
<p>当在后台添加一个商品的时候要选择一个商品类型，选择了一个商品类型就决定了这个商品的有哪些属性，如下是添加商品设置其商品属性：</p>
<p><img loading="lazy" decoding="async" width="359" height="255" class="wp-image-7978" src="/wp-content/uploads/2018/06/word-image-572.png" srcset="/wp-content/uploads/2018/06/word-image-572.png 359w, /wp-content/uploads/2018/06/word-image-572-300x213.png 300w" sizes="(max-width: 359px) 100vw, 359px" /></p>
<p>给商品添加属性：</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" width="794" height="225" class="wp-image-7979" src="/wp-content/uploads/2018/06/word-image-573.png" srcset="/wp-content/uploads/2018/06/word-image-573.png 794w, /wp-content/uploads/2018/06/word-image-573-300x85.png 300w, /wp-content/uploads/2018/06/word-image-573-768x218.png 768w" sizes="(max-width: 794px) 100vw, 794px" /></p>
<p>特点如下：</p>
<p>唯一属性（只能看，不能选）：前面没有【+】，不可以设置价格</p>
<p>单选属性（可选择）：前面有【+】，点击+即可复制多个，不同的单选属性可设置不同的价格</p>
<p>属性值手工输入：对应的是个input框，需要自己输入。</p>
<p>属性值是列表选择： 对应的是个select下拉框，需选中一个属性值。</p>
<h2>4、商品分类</h2>
<p>一般一个网站决定卖什么类型商品就决定了其商品分类。</p>
<p>如卖汽车网站：分类有国产、日系、德系、韩系等</p>
<p>如卖化妆品网站：分类洗面奶、乳液、面膜、保湿、祛痘、眼霜等</p>
<p><img loading="lazy" decoding="async" width="1323" height="236" class="wp-image-7980" src="/wp-content/uploads/2018/06/word-image-574.png" srcset="/wp-content/uploads/2018/06/word-image-574.png 1323w, /wp-content/uploads/2018/06/word-image-574-300x54.png 300w, /wp-content/uploads/2018/06/word-image-574-768x137.png 768w, /wp-content/uploads/2018/06/word-image-574-1024x183.png 1024w" sizes="(max-width: 1323px) 100vw, 1323px" /></p>
<h1>二、完成商品类型的curd</h1>
<h2>商品类型介绍</h2>
<p>商品类型：不同的网站的卖的商品类型是不一样的，比如化妆品网站专卖化妆品、手机网站专卖手机、二手汽车网站专买二手汽车。</p>
<p>网站决定卖什么商品类型，也就决定了商品的商品属性</p>
<h2>商品类型的增加</h2>
<p>商品类型表如下:</p>
<p><img loading="lazy" decoding="async" width="986" height="155" class="wp-image-7981" src="/wp-content/uploads/2018/06/word-image-575.png" srcset="/wp-content/uploads/2018/06/word-image-575.png 986w, /wp-content/uploads/2018/06/word-image-575-300x47.png 300w, /wp-content/uploads/2018/06/word-image-575-768x121.png 768w" sizes="(max-width: 986px) 100vw, 986px" /></p>
<p>1：在admin-TypeController-add中，完成添加商品类型完成</p>
<p><img loading="lazy" decoding="async" width="1038" height="519" class="wp-image-7982" src="/wp-content/uploads/2018/06/word-image-576.png" srcset="/wp-content/uploads/2018/06/word-image-576.png 1038w, /wp-content/uploads/2018/06/word-image-576-300x150.png 300w, /wp-content/uploads/2018/06/word-image-576-768x384.png 768w, /wp-content/uploads/2018/06/word-image-576-1024x512.png 1024w" sizes="(max-width: 1038px) 100vw, 1038px" /></p>
<ol>
<li>在add模板中设置表单name名称</li>
</ol>
<p><img loading="lazy" decoding="async" width="1263" height="589" class="wp-image-7983" src="/wp-content/uploads/2018/06/word-image-577.png" srcset="/wp-content/uploads/2018/06/word-image-577.png 1263w, /wp-content/uploads/2018/06/word-image-577-300x140.png 300w, /wp-content/uploads/2018/06/word-image-577-768x358.png 768w, /wp-content/uploads/2018/06/word-image-577-1024x478.png 1024w" sizes="(max-width: 1263px) 100vw, 1263px" /></p>
<p>3、同时建立一个Type的验证器和Type模型</p>
<p>验证器：</p>
<p><img loading="lazy" decoding="async" width="888" height="523" class="wp-image-7984" src="/wp-content/uploads/2018/06/word-image-578.png" srcset="/wp-content/uploads/2018/06/word-image-578.png 888w, /wp-content/uploads/2018/06/word-image-578-300x177.png 300w, /wp-content/uploads/2018/06/word-image-578-768x452.png 768w" sizes="(max-width: 888px) 100vw, 888px" /></p>
<p>模型：</p>
<p><img loading="lazy" decoding="async" width="796" height="268" class="wp-image-7985" src="/wp-content/uploads/2018/06/word-image-579.png" srcset="/wp-content/uploads/2018/06/word-image-579.png 796w, /wp-content/uploads/2018/06/word-image-579-300x101.png 300w, /wp-content/uploads/2018/06/word-image-579-768x259.png 768w" sizes="(max-width: 796px) 100vw, 796px" /></p>
<h2>商品类型的列表</h2>
<ol>
<li>在admin-Type-index方法中取出所有的商品类型分配到模板中</li>
</ol>
<p><img loading="lazy" decoding="async" width="746" height="314" class="wp-image-7986" src="/wp-content/uploads/2018/06/word-image-580.png" srcset="/wp-content/uploads/2018/06/word-image-580.png 746w, /wp-content/uploads/2018/06/word-image-580-300x126.png 300w" sizes="(max-width: 746px) 100vw, 746px" /></p>
<ol>
<li>index.html模板中遍历数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1263" height="493" class="wp-image-7987" src="/wp-content/uploads/2018/06/word-image-581.png" srcset="/wp-content/uploads/2018/06/word-image-581.png 1263w, /wp-content/uploads/2018/06/word-image-581-300x117.png 300w, /wp-content/uploads/2018/06/word-image-581-768x300.png 768w, /wp-content/uploads/2018/06/word-image-581-1024x400.png 1024w" sizes="(max-width: 1263px) 100vw, 1263px" /></p>
<h2>商品类型的编辑</h2>
<ol>
<li>修改index.html的编辑的链接地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1201" height="404" class="wp-image-7988" src="/wp-content/uploads/2018/06/word-image-582.png" srcset="/wp-content/uploads/2018/06/word-image-582.png 1201w, /wp-content/uploads/2018/06/word-image-582-300x101.png 300w, /wp-content/uploads/2018/06/word-image-582-768x258.png 768w, /wp-content/uploads/2018/06/word-image-582-1024x344.png 1024w" sizes="(max-width: 1201px) 100vw, 1201px" /></p>
<p>2、在admin-type-upd方法中完取出当前商品类型的数据回显到模板中，并完成编辑入库的实现</p>
<p><img loading="lazy" decoding="async" width="1070" height="509" class="wp-image-7989" src="/wp-content/uploads/2018/06/word-image-583.png" srcset="/wp-content/uploads/2018/06/word-image-583.png 1070w, /wp-content/uploads/2018/06/word-image-583-300x143.png 300w, /wp-content/uploads/2018/06/word-image-583-768x365.png 768w, /wp-content/uploads/2018/06/word-image-583-1024x487.png 1024w" sizes="(max-width: 1070px) 100vw, 1070px" /></p>
<p>3、模板upd.html回显内容</p>
<p><img loading="lazy" decoding="async" width="1271" height="587" class="wp-image-7990" src="/wp-content/uploads/2018/06/word-image-584.png" srcset="/wp-content/uploads/2018/06/word-image-584.png 1271w, /wp-content/uploads/2018/06/word-image-584-300x139.png 300w, /wp-content/uploads/2018/06/word-image-584-768x355.png 768w, /wp-content/uploads/2018/06/word-image-584-1024x473.png 1024w" sizes="(max-width: 1271px) 100vw, 1271px" /></p>
<h2>商品类型的删除</h2>
<ol>
<li>修改index.html的删除的链接地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1238" height="385" class="wp-image-7991" src="/wp-content/uploads/2018/06/word-image-585.png" srcset="/wp-content/uploads/2018/06/word-image-585.png 1238w, /wp-content/uploads/2018/06/word-image-585-300x93.png 300w, /wp-content/uploads/2018/06/word-image-585-768x239.png 768w, /wp-content/uploads/2018/06/word-image-585-1024x318.png 1024w" sizes="(max-width: 1238px) 100vw, 1238px" /></p>
<ol>
<li>在admin-type-del方法中完成删除</li>
</ol>
<p><img loading="lazy" decoding="async" width="953" height="345" class="wp-image-7992" src="/wp-content/uploads/2018/06/word-image-586.png" srcset="/wp-content/uploads/2018/06/word-image-586.png 953w, /wp-content/uploads/2018/06/word-image-586-300x109.png 300w, /wp-content/uploads/2018/06/word-image-586-768x278.png 768w" sizes="(max-width: 953px) 100vw, 953px" /></p>
<h1>三、完成商品属性的curd</h1>
<h2>1、商品属性的认识</h2>
<p>网站决定卖什么商品类型，也就决定了商品的商品属性</p>
<p>可以参考ecshop添加属性的方式:</p>
<p><img loading="lazy" decoding="async" width="960" height="427" class="wp-image-7993" src="/wp-content/uploads/2018/06/word-image-587.png" srcset="/wp-content/uploads/2018/06/word-image-587.png 960w, /wp-content/uploads/2018/06/word-image-587-300x133.png 300w, /wp-content/uploads/2018/06/word-image-587-768x342.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p>属性这里重点两种属性：唯一属性和单选属性</p>
<p>唯一属性：只能看，不能选。</p>
<p><img loading="lazy" decoding="async" width="389" height="55" class="wp-image-7994" src="/wp-content/uploads/2018/06/word-image-588.png" srcset="/wp-content/uploads/2018/06/word-image-588.png 389w, /wp-content/uploads/2018/06/word-image-588-300x42.png 300w" sizes="(max-width: 389px) 100vw, 389px" /></p>
<p>单选属性：我们购买商品的时候，可以选择的，后面添加商品的时候，不同的单选属性价格也是不一样的，如iphone6银色和iphone黑色价格是不一样的。</p>
<p><img loading="lazy" decoding="async" width="678" height="186" class="wp-image-7995" src="/wp-content/uploads/2018/06/word-image-589.png" srcset="/wp-content/uploads/2018/06/word-image-589.png 678w, /wp-content/uploads/2018/06/word-image-589-300x82.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<p>②属性的值的录入方式</p>
<p><img loading="lazy" decoding="async" width="643" height="114" class="wp-image-7996" src="/wp-content/uploads/2018/06/word-image-590.png" srcset="/wp-content/uploads/2018/06/word-image-590.png 643w, /wp-content/uploads/2018/06/word-image-590-300x53.png 300w" sizes="(max-width: 643px) 100vw, 643px" /></p>
<p>手工输入：不可以输入属性值，且可选值列表是禁用状态，只能在添加商品的时候输入属性值。</p>
<p>列表选择：在可选择列表输入一些我们指定的属性值，添加商品的时候，从中选中一个属性值即可。</p>
<p>表结构：</p>
<p><img loading="lazy" decoding="async" width="916" height="162" class="wp-image-7997" src="/wp-content/uploads/2018/06/word-image-591.png" srcset="/wp-content/uploads/2018/06/word-image-591.png 916w, /wp-content/uploads/2018/06/word-image-591-300x53.png 300w, /wp-content/uploads/2018/06/word-image-591-768x136.png 768w" sizes="(max-width: 916px) 100vw, 916px" /></p>
<h2>完成商品属性的添加</h2>
<ol>
<li>在admin-attribute-add方法中完成添加属性的完成</li>
</ol>
<p><img loading="lazy" decoding="async" width="1161" height="711" class="wp-image-7998" src="/wp-content/uploads/2018/06/word-image-592.png" srcset="/wp-content/uploads/2018/06/word-image-592.png 1161w, /wp-content/uploads/2018/06/word-image-592-300x184.png 300w, /wp-content/uploads/2018/06/word-image-592-768x470.png 768w, /wp-content/uploads/2018/06/word-image-592-1024x627.png 1024w" sizes="(max-width: 1161px) 100vw, 1161px" /></p>
<p>Attribute验证器定义验证场景验证：</p>
<p><img loading="lazy" decoding="async" width="1110" height="598" class="wp-image-7999" src="/wp-content/uploads/2018/06/word-image-593.png" srcset="/wp-content/uploads/2018/06/word-image-593.png 1110w, /wp-content/uploads/2018/06/word-image-593-300x162.png 300w, /wp-content/uploads/2018/06/word-image-593-768x414.png 768w, /wp-content/uploads/2018/06/word-image-593-1024x552.png 1024w" sizes="(max-width: 1110px) 100vw, 1110px" /></p>
<p>Attribue模型如下：</p>
<p><img loading="lazy" decoding="async" width="756" height="393" class="wp-image-8000" src="/wp-content/uploads/2018/06/word-image-594.png" srcset="/wp-content/uploads/2018/06/word-image-594.png 756w, /wp-content/uploads/2018/06/word-image-594-300x156.png 300w" sizes="(max-width: 756px) 100vw, 756px" /></p>
<ol>
<li>在add.html模板中设置表单name属性值</li>
</ol>
<p><img loading="lazy" decoding="async" width="1219" height="683" class="wp-image-8001" src="/wp-content/uploads/2018/06/word-image-595.png" srcset="/wp-content/uploads/2018/06/word-image-595.png 1219w, /wp-content/uploads/2018/06/word-image-595-300x168.png 300w, /wp-content/uploads/2018/06/word-image-595-768x430.png 768w, /wp-content/uploads/2018/06/word-image-595-1024x574.png 1024w" sizes="(max-width: 1219px) 100vw, 1219px" /> <img loading="lazy" decoding="async" width="653" height="125" class="wp-image-8002" src="/wp-content/uploads/2018/06/word-image-596.png" srcset="/wp-content/uploads/2018/06/word-image-596.png 653w, /wp-content/uploads/2018/06/word-image-596-300x57.png 300w" sizes="(max-width: 653px) 100vw, 653px" /></p>
<p>注意：当选择手工输入的时候，可选择列表是禁用disabled,若是列表选择，变为可用</p>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="1002" height="373" class="wp-image-8003" src="/wp-content/uploads/2018/06/word-image-597.png" srcset="/wp-content/uploads/2018/06/word-image-597.png 1002w, /wp-content/uploads/2018/06/word-image-597-300x112.png 300w, /wp-content/uploads/2018/06/word-image-597-768x286.png 768w" sizes="(max-width: 1002px) 100vw, 1002px" /></p>
<h2>完成属性的列表</h2>
<ol>
<li>在admin-attribue-index方法中取出所有的属性数据，分配到模板中</li>
</ol>
<p><img loading="lazy" decoding="async" width="1026" height="476" class="wp-image-8004" src="/wp-content/uploads/2018/06/word-image-598.png" srcset="/wp-content/uploads/2018/06/word-image-598.png 1026w, /wp-content/uploads/2018/06/word-image-598-300x139.png 300w, /wp-content/uploads/2018/06/word-image-598-768x356.png 768w, /wp-content/uploads/2018/06/word-image-598-1024x475.png 1024w" sizes="(max-width: 1026px) 100vw, 1026px" /></p>
<ol>
<li>模板中遍历权限数据</li>
</ol>
<p>联表方式：</p>
<p><img loading="lazy" decoding="async" width="984" height="518" class="wp-image-8005" src="/wp-content/uploads/2018/06/word-image-599.png" srcset="/wp-content/uploads/2018/06/word-image-599.png 984w, /wp-content/uploads/2018/06/word-image-599-300x158.png 300w, /wp-content/uploads/2018/06/word-image-599-768x404.png 768w" sizes="(max-width: 984px) 100vw, 984px" /></p>
<p>不联表方式：</p>
<p><img loading="lazy" decoding="async" width="1224" height="344" class="wp-image-8006" src="/wp-content/uploads/2018/06/word-image-600.png" srcset="/wp-content/uploads/2018/06/word-image-600.png 1224w, /wp-content/uploads/2018/06/word-image-600-300x84.png 300w, /wp-content/uploads/2018/06/word-image-600-768x216.png 768w, /wp-content/uploads/2018/06/word-image-600-1024x288.png 1024w" sizes="(max-width: 1224px) 100vw, 1224px" /></p>
<h2>完成属性的编辑</h2>
<p>1、修改index.html的编辑的链接地址</p>
<p><img loading="lazy" decoding="async" width="1272" height="394" class="wp-image-8007" src="/wp-content/uploads/2018/06/word-image-601.png" srcset="/wp-content/uploads/2018/06/word-image-601.png 1272w, /wp-content/uploads/2018/06/word-image-601-300x93.png 300w, /wp-content/uploads/2018/06/word-image-601-768x238.png 768w, /wp-content/uploads/2018/06/word-image-601-1024x317.png 1024w" sizes="(max-width: 1272px) 100vw, 1272px" /></p>
<ol>
<li>在admin-attribute-upd方法中取出数据回显到模板中，并完成编辑的入库实现</li>
</ol>
<p><img loading="lazy" decoding="async" width="1065" height="702" class="wp-image-8008" src="/wp-content/uploads/2018/06/word-image-602.png" srcset="/wp-content/uploads/2018/06/word-image-602.png 1065w, /wp-content/uploads/2018/06/word-image-602-300x198.png 300w, /wp-content/uploads/2018/06/word-image-602-768x506.png 768w, /wp-content/uploads/2018/06/word-image-602-1024x675.png 1024w" sizes="(max-width: 1065px) 100vw, 1065px" /></p>
<p>3、模板中显示数据</p>
<p><img loading="lazy" decoding="async" width="1206" height="708" class="wp-image-8009" src="/wp-content/uploads/2018/06/word-image-603.png" srcset="/wp-content/uploads/2018/06/word-image-603.png 1206w, /wp-content/uploads/2018/06/word-image-603-300x176.png 300w, /wp-content/uploads/2018/06/word-image-603-768x451.png 768w, /wp-content/uploads/2018/06/word-image-603-1024x601.png 1024w" sizes="(max-width: 1206px) 100vw, 1206px" /></p>
<p>让单选框两种方式默认选中：</p>
<p>方式一：</p>
<p><img loading="lazy" decoding="async" width="991" height="305" class="wp-image-8010" src="/wp-content/uploads/2018/06/word-image-604.png" srcset="/wp-content/uploads/2018/06/word-image-604.png 991w, /wp-content/uploads/2018/06/word-image-604-300x92.png 300w, /wp-content/uploads/2018/06/word-image-604-768x236.png 768w" sizes="(max-width: 991px) 100vw, 991px" /></p>
<p>方式二：通过Jq实现，推荐写法</p>
<p><img loading="lazy" decoding="async" width="1156" height="618" class="wp-image-8011" src="/wp-content/uploads/2018/06/word-image-605.png" srcset="/wp-content/uploads/2018/06/word-image-605.png 1156w, /wp-content/uploads/2018/06/word-image-605-300x160.png 300w, /wp-content/uploads/2018/06/word-image-605-768x411.png 768w, /wp-content/uploads/2018/06/word-image-605-1024x547.png 1024w" sizes="(max-width: 1156px) 100vw, 1156px" /></p>
<h2>ajax完成商品属性的删除</h2>
<ol>
<li>给删除链接地址，绑定class和attr_id自定义属性，并且阻止默认行为</li>
</ol>
<p><img loading="lazy" decoding="async" width="1250" height="355" class="wp-image-8012" src="/wp-content/uploads/2018/06/word-image-606.png" srcset="/wp-content/uploads/2018/06/word-image-606.png 1250w, /wp-content/uploads/2018/06/word-image-606-300x85.png 300w, /wp-content/uploads/2018/06/word-image-606-768x218.png 768w, /wp-content/uploads/2018/06/word-image-606-1024x291.png 1024w" sizes="(max-width: 1250px) 100vw, 1250px" /></p>
<ol>
<li>给class=delAttr绑定单击事件，使用ajax进行删除</li>
</ol>
<p><img loading="lazy" decoding="async" width="1173" height="468" class="wp-image-8013" src="/wp-content/uploads/2018/06/word-image-607.png" srcset="/wp-content/uploads/2018/06/word-image-607.png 1173w, /wp-content/uploads/2018/06/word-image-607-300x120.png 300w, /wp-content/uploads/2018/06/word-image-607-768x306.png 768w, /wp-content/uploads/2018/06/word-image-607-1024x409.png 1024w" sizes="(max-width: 1173px) 100vw, 1173px" /></p>
<ol>
<li>在admin-attribute-ajaxDel方法中完成删除的实现</li>
</ol>
<h1>四、完成商品分类的curd</h1>
<h2>1、分析分类表结构</h2>
<p>表字段结构如下：</p>
<p><img loading="lazy" decoding="async" width="760" height="153" class="wp-image-8014" src="/wp-content/uploads/2018/06/word-image-608.png" srcset="/wp-content/uploads/2018/06/word-image-608.png 760w, /wp-content/uploads/2018/06/word-image-608-300x60.png 300w" sizes="(max-width: 760px) 100vw, 760px" /></p>
<h2>完成商品分类的添加</h2>
<p>找当前分类的祖先分类：传递当前分类的pid ,谁的cat_id等于我的pid就找到我的祖先。</p>
<p>找当前分类的子孙分类：传递当前分类的cat_id ,谁的pid等于我的cat_id就找到我的子孙</p>
<ol>
<li>在admin-category-add方法中完成添加分类的完成</li>
</ol>
<p><img loading="lazy" decoding="async" width="949" height="536" class="wp-image-8015" src="/wp-content/uploads/2018/06/word-image-609.png" srcset="/wp-content/uploads/2018/06/word-image-609.png 949w, /wp-content/uploads/2018/06/word-image-609-300x169.png 300w, /wp-content/uploads/2018/06/word-image-609-768x434.png 768w" sizes="(max-width: 949px) 100vw, 949px" /></p>
<p>验证器：</p>
<p><img loading="lazy" decoding="async" width="730" height="546" class="wp-image-8016" src="/wp-content/uploads/2018/06/word-image-610.png" srcset="/wp-content/uploads/2018/06/word-image-610.png 730w, /wp-content/uploads/2018/06/word-image-610-300x224.png 300w" sizes="(max-width: 730px) 100vw, 730px" /></p>
<p>模型：</p>
<p><img loading="lazy" decoding="async" width="1109" height="639" class="wp-image-8017" src="/wp-content/uploads/2018/06/word-image-611.png" srcset="/wp-content/uploads/2018/06/word-image-611.png 1109w, /wp-content/uploads/2018/06/word-image-611-300x173.png 300w, /wp-content/uploads/2018/06/word-image-611-768x443.png 768w, /wp-content/uploads/2018/06/word-image-611-1024x590.png 1024w" sizes="(max-width: 1109px) 100vw, 1109px" /></p>
<p>2、在add.html模板中设置表单name属性值</p>
<p><img loading="lazy" decoding="async" width="1196" height="591" class="wp-image-8018" src="/wp-content/uploads/2018/06/word-image-612.png" srcset="/wp-content/uploads/2018/06/word-image-612.png 1196w, /wp-content/uploads/2018/06/word-image-612-300x148.png 300w, /wp-content/uploads/2018/06/word-image-612-768x380.png 768w, /wp-content/uploads/2018/06/word-image-612-1024x506.png 1024w" sizes="(max-width: 1196px) 100vw, 1196px" /></p>
<h2>完成商品分类的列表</h2>
<ol>
<li>在admin-category-index方法中取出所有的分类数据，分配到模板中</li>
</ol>
<p><img loading="lazy" decoding="async" width="785" height="352" class="wp-image-8019" src="/wp-content/uploads/2018/06/word-image-613.png" srcset="/wp-content/uploads/2018/06/word-image-613.png 785w, /wp-content/uploads/2018/06/word-image-613-300x135.png 300w, /wp-content/uploads/2018/06/word-image-613-768x344.png 768w" sizes="(max-width: 785px) 100vw, 785px" /></p>
<p>同时为了不用联表，把分类的无限级分类的以cat_id作为下标</p>
<p><img loading="lazy" decoding="async" width="1126" height="457" class="wp-image-8020" src="/wp-content/uploads/2018/06/word-image-614.png" srcset="/wp-content/uploads/2018/06/word-image-614.png 1126w, /wp-content/uploads/2018/06/word-image-614-300x122.png 300w, /wp-content/uploads/2018/06/word-image-614-768x312.png 768w, /wp-content/uploads/2018/06/word-image-614-1024x416.png 1024w" sizes="(max-width: 1126px) 100vw, 1126px" /></p>
<p>2、模板index.html中遍历分类数据</p>
<p><img loading="lazy" decoding="async" width="1279" height="572" class="wp-image-8021" src="/wp-content/uploads/2018/06/word-image-615.png" srcset="/wp-content/uploads/2018/06/word-image-615.png 1279w, /wp-content/uploads/2018/06/word-image-615-300x134.png 300w, /wp-content/uploads/2018/06/word-image-615-768x343.png 768w, /wp-content/uploads/2018/06/word-image-615-1024x458.png 1024w" sizes="(max-width: 1279px) 100vw, 1279px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="1156" height="241" class="wp-image-8022" src="/wp-content/uploads/2018/06/word-image-616.png" srcset="/wp-content/uploads/2018/06/word-image-616.png 1156w, /wp-content/uploads/2018/06/word-image-616-300x63.png 300w, /wp-content/uploads/2018/06/word-image-616-768x160.png 768w, /wp-content/uploads/2018/06/word-image-616-1024x213.png 1024w" sizes="(max-width: 1156px) 100vw, 1156px" /></p>
<h2>完成商品分类的编辑</h2>
<ol>
<li>修改index.html的编辑的链接地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1258" height="353" class="wp-image-8023" src="/wp-content/uploads/2018/06/word-image-617.png" srcset="/wp-content/uploads/2018/06/word-image-617.png 1258w, /wp-content/uploads/2018/06/word-image-617-300x84.png 300w, /wp-content/uploads/2018/06/word-image-617-768x216.png 768w, /wp-content/uploads/2018/06/word-image-617-1024x287.png 1024w" sizes="(max-width: 1258px) 100vw, 1258px" /></p>
<p>2、在admin-category-upd方法中完取出当前分类的数据回显到模板中，并完成编辑入库的实现</p>
<p><img loading="lazy" decoding="async" width="1000" height="644" class="wp-image-8024" src="/wp-content/uploads/2018/06/word-image-618.png" srcset="/wp-content/uploads/2018/06/word-image-618.png 1000w, /wp-content/uploads/2018/06/word-image-618-300x193.png 300w, /wp-content/uploads/2018/06/word-image-618-768x495.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<h2>5、【作业】完成商品分类的删除</h2>
<p>自行完成</p>
<p>CategoryController:</p>
<p><img loading="lazy" decoding="async" width="577" height="326" class="wp-image-8025" src="/wp-content/uploads/2018/06/word-image-619.png" srcset="/wp-content/uploads/2018/06/word-image-619.png 577w, /wp-content/uploads/2018/06/word-image-619-300x169.png 300w" sizes="(max-width: 577px) 100vw, 577px" /></p>
<p>Html:</p>
<p><img loading="lazy" decoding="async" width="883" height="122" class="wp-image-8026" src="/wp-content/uploads/2018/06/word-image-620.png" srcset="/wp-content/uploads/2018/06/word-image-620.png 883w, /wp-content/uploads/2018/06/word-image-620-300x41.png 300w, /wp-content/uploads/2018/06/word-image-620-768x106.png 768w" sizes="(max-width: 883px) 100vw, 883px" /> <img loading="lazy" decoding="async" width="734" height="403" class="wp-image-8027" src="/wp-content/uploads/2018/06/word-image-621.png" srcset="/wp-content/uploads/2018/06/word-image-621.png 734w, /wp-content/uploads/2018/06/word-image-621-300x165.png 300w" sizes="(max-width: 734px) 100vw, 734px" /></p>
<h1>六、完成商品类型列表中属性的查看</h1>
<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-8028" src="/wp-content/uploads/2018/06/word-image-622.png" /></p>
<p>商品的基本信息数据存储在sh_goods表中，商品属性数据存储在sh_goods_attr中</p>
<p>商品表sh_goods表结构：</p>
<p>商品属性表sh_goods_attr表结构：</p>
<h2>完成商品基本信息的入库</h2>
<h3>（1）展示添加商品模板</h3>
<h3>基本信息入库操作</h3>
<h2>4、添加商品的多图片上传</h2>
<h3>（1）思路分析</h3>
<p>实现思路：可以参考ecshop开源商城：</p>
<p><img loading="lazy" decoding="async" width="985" height="188" class="wp-image-8029" src="/wp-content/uploads/2018/06/word-image-623.png" srcset="/wp-content/uploads/2018/06/word-image-623.png 985w, /wp-content/uploads/2018/06/word-image-623-300x57.png 300w, /wp-content/uploads/2018/06/word-image-623-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>
<h3>实现多图片的上传</h3>
<h3>（4）生成多图片的缩略图</h3>
<p>生成缩略图的步骤：</p>
<ul>
<li>Image打开源图片 $image = \Think\Image::open(源图片);</li>
<li>进行缩放处理 $image -&gt; thumb(宽度，高度，类型)</li>
<li>把缩放好的图片保存到服务器上 $image -&gt; save(小图路径名);</li>
</ul>
<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-8030" src="/wp-content/uploads/2018/06/word-image-624.png" srcset="/wp-content/uploads/2018/06/word-image-624.png 1084w, /wp-content/uploads/2018/06/word-image-624-300x86.png 300w, /wp-content/uploads/2018/06/word-image-624-768x221.png 768w, /wp-content/uploads/2018/06/word-image-624-1024x295.png 1024w" sizes="(max-width: 1084px) 100vw, 1084px" /></p>
<p>从上面添加商品属性可以看出，动态生成商品属性的时候，共有四种组合情况。</p>
<p>其实就是属性类型和属性值录入方式的互相组合：</p>
<p>①唯一属性+手工输入</p>
<p>②唯一属性+列表选择</p>
<p>③单选属性+手工输入</p>
<p>④单选属性+列表选择</p>
<p>其实可以把上面每个动态生成的属性信息看作是被包含在一个li标签中。</p>
<p>分析四种组合情况生成动态属性的特点如下：</p>
<p>元素从左到右分析：</p>
<ul>
<li>单选属性属性名称前有个[+]或[-]号，可以进行加减，而唯一属性则没有</li>
<li>属性名称</li>
<li>属性值录入方式为手工输入，则对应属性值的输入方式的是一个输入框(&lt;input type=’text’/&gt;)，而属性值录入方式为列表选择的时候则对应属性值的输入方式的是一个select下拉框。</li>
<li>单选属性可以输入价格，而唯一属性则没有</li>
</ul>
<h2>完成商品的动态属性生成</h2>
<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>
<h1>九、商品列表展示</h1>
<h1>十、使用ajax+layer弹出层查看商品详情</h1>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7899.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>TP5 商城（五）商城前台首页、首页导航栏、首页分类筛选、首页推荐位、前台会员注册、短信验证、前台会员登录与验证码、前台退出功能、邮箱找回密码</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8157.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8157.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 09 Jun 2018 00:36:50 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></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=8157</guid>

					<description><![CDATA[商城实战第五天 搭建商城前台首页 把商城前台资源文件复制到/home下面 在home-indexControl [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>商城实战第五天</h1>
<h1>搭建商城前台首页</h1>
<ol>
<li>把商城前台资源文件复制到/home下面</li>
</ol>
<p><img loading="lazy" decoding="async" width="817" height="247" class="wp-image-8158" src="/wp-content/uploads/2018/06/word-image-743.png" srcset="/wp-content/uploads/2018/06/word-image-743.png 817w, /wp-content/uploads/2018/06/word-image-743-300x91.png 300w, /wp-content/uploads/2018/06/word-image-743-768x232.png 768w" sizes="(max-width: 817px) 100vw, 817px" /></p>
<ol>
<li>在home-indexController-index方法中，输出模板</li>
</ol>
<p><img loading="lazy" decoding="async" width="779" height="311" class="wp-image-8159" src="/wp-content/uploads/2018/06/word-image-744.png" srcset="/wp-content/uploads/2018/06/word-image-744.png 779w, /wp-content/uploads/2018/06/word-image-744-300x120.png 300w, /wp-content/uploads/2018/06/word-image-744-768x307.png 768w" sizes="(max-width: 779px) 100vw, 779px" /></p>
<ol>
<li>复制前台的index.html模板到/home/view/index/目录下，并修改进行静态资源目录</li>
</ol>
<p><img loading="lazy" decoding="async" width="739" height="383" class="wp-image-8160" src="/wp-content/uploads/2018/06/word-image-745.png" srcset="/wp-content/uploads/2018/06/word-image-745.png 739w, /wp-content/uploads/2018/06/word-image-745-300x155.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="957" height="296" class="wp-image-8161" src="/wp-content/uploads/2018/06/word-image-746.png" srcset="/wp-content/uploads/2018/06/word-image-746.png 957w, /wp-content/uploads/2018/06/word-image-746-300x93.png 300w, /wp-content/uploads/2018/06/word-image-746-768x238.png 768w" sizes="(max-width: 957px) 100vw, 957px" /></p>
<p>注：开发前台先把默认访问的模块改为Home，修改config.php配置</p>
<p><img loading="lazy" decoding="async" width="666" height="180" class="wp-image-8162" src="/wp-content/uploads/2018/06/word-image-747.png" srcset="/wp-content/uploads/2018/06/word-image-747.png 666w, /wp-content/uploads/2018/06/word-image-747-300x81.png 300w" sizes="(max-width: 666px) 100vw, 666px" /></p>
<h1>url访问模块报错（for Bidden）的解决</h1>
<p>如访问 <a href="/goto/htjc" rel="nofollow">http://域名/模块名/这样会报错。</a> 这是因为直接访问到 /public/home/目录，此目录下面没有默认的访问页index.html，解决办法：把前后台资源目录放在/public/static/下面，并且修改config.php配置文件中的前后台资源目录：</p>
<p><img loading="lazy" decoding="async" width="224" height="262" class="wp-image-8163" src="/wp-content/uploads/2018/06/word-image-748.png" /> <img loading="lazy" decoding="async" width="520" height="178" class="wp-image-8164" src="/wp-content/uploads/2018/06/word-image-749.png" srcset="/wp-content/uploads/2018/06/word-image-749.png 520w, /wp-content/uploads/2018/06/word-image-749-300x103.png 300w" sizes="(max-width: 520px) 100vw, 520px" /></p>
<h1>二、实现前台首页相关功能</h1>
<h2>完成首页的导航栏</h2>
<p><img loading="lazy" decoding="async" width="1046" height="158" class="wp-image-8165" src="/wp-content/uploads/2018/06/word-image-750.png" srcset="/wp-content/uploads/2018/06/word-image-750.png 1046w, /wp-content/uploads/2018/06/word-image-750-300x45.png 300w, /wp-content/uploads/2018/06/word-image-750-768x116.png 768w, /wp-content/uploads/2018/06/word-image-750-1024x155.png 1024w" sizes="(max-width: 1046px) 100vw, 1046px" /></p>
<p>因为导航栏的栏目比较多，我们只取出顶级栏目（即pid=0），并且is_show=1,加上limit限制取出的条数即可</p>
<p>代码如下：</p>
<p>1、在home-IndexController-index方法中取出对应导航栏分类数据。</p>
<p><img loading="lazy" decoding="async" width="1043" height="388" class="wp-image-8166" src="/wp-content/uploads/2018/06/word-image-751.png" srcset="/wp-content/uploads/2018/06/word-image-751.png 1043w, /wp-content/uploads/2018/06/word-image-751-300x112.png 300w, /wp-content/uploads/2018/06/word-image-751-768x286.png 768w, /wp-content/uploads/2018/06/word-image-751-1024x381.png 1024w" sizes="(max-width: 1043px) 100vw, 1043px" /></p>
<ol>
<li>在home-view-index-index.html模板中遍历数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1162" height="420" class="wp-image-8167" src="/wp-content/uploads/2018/06/word-image-752.png" srcset="/wp-content/uploads/2018/06/word-image-752.png 1162w, /wp-content/uploads/2018/06/word-image-752-300x108.png 300w, /wp-content/uploads/2018/06/word-image-752-768x278.png 768w, /wp-content/uploads/2018/06/word-image-752-1024x370.png 1024w" sizes="(max-width: 1162px) 100vw, 1162px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="535" height="57" class="wp-image-8168" src="/wp-content/uploads/2018/06/word-image-753.png" srcset="/wp-content/uploads/2018/06/word-image-753.png 535w, /wp-content/uploads/2018/06/word-image-753-300x32.png 300w" sizes="(max-width: 535px) 100vw, 535px" /></p>
<h2>2、完成首页的分类筛选</h2>
<p><img loading="lazy" decoding="async" width="740" height="254" class="wp-image-8169" src="/wp-content/uploads/2018/06/word-image-754.png" srcset="/wp-content/uploads/2018/06/word-image-754.png 740w, /wp-content/uploads/2018/06/word-image-754-300x103.png 300w" sizes="(max-width: 740px) 100vw, 740px" /></p>
<p>上面的三级分类的做法和角色分配权限技巧是一样。</p>
<ol>
<li>取出所有的分类数据，以主键cat_id作为select返回结果的下标</li>
<li>根据pid进行分组，把具有相同pid的值归为同一个组，方便模板中循环。</li>
</ol>
<p>代码如下：</p>
<p>1、按照上面两个技巧进行组装数据，分配到模板中</p>
<p><img loading="lazy" decoding="async" width="1014" height="623" class="wp-image-8170" src="/wp-content/uploads/2018/06/word-image-755.png" srcset="/wp-content/uploads/2018/06/word-image-755.png 1014w, /wp-content/uploads/2018/06/word-image-755-300x184.png 300w, /wp-content/uploads/2018/06/word-image-755-768x472.png 768w" sizes="(max-width: 1014px) 100vw, 1014px" /></p>
<p>其中$cats和$children变量数据如下：</p>
<p><img loading="lazy" decoding="async" width="774" height="432" class="wp-image-8171" src="/wp-content/uploads/2018/06/word-image-756.png" srcset="/wp-content/uploads/2018/06/word-image-756.png 774w, /wp-content/uploads/2018/06/word-image-756-300x167.png 300w, /wp-content/uploads/2018/06/word-image-756-768x429.png 768w" sizes="(max-width: 774px) 100vw, 774px" /></p>
<ol>
<li>在模板中遍历</li>
</ol>
<p><img loading="lazy" decoding="async" width="1236" height="677" class="wp-image-8172" src="/wp-content/uploads/2018/06/word-image-757.png" srcset="/wp-content/uploads/2018/06/word-image-757.png 1236w, /wp-content/uploads/2018/06/word-image-757-300x164.png 300w, /wp-content/uploads/2018/06/word-image-757-768x421.png 768w, /wp-content/uploads/2018/06/word-image-757-1024x561.png 1024w" sizes="(max-width: 1236px) 100vw, 1236px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="727" height="121" class="wp-image-8173" src="/wp-content/uploads/2018/06/word-image-758.png" srcset="/wp-content/uploads/2018/06/word-image-758.png 727w, /wp-content/uploads/2018/06/word-image-758-300x50.png 300w" sizes="(max-width: 727px) 100vw, 727px" /></p>
<h2>3、首页的推荐位</h2>
<p><img loading="lazy" decoding="async" width="915" height="275" class="wp-image-8174" src="/wp-content/uploads/2018/06/word-image-759.png" srcset="/wp-content/uploads/2018/06/word-image-759.png 915w, /wp-content/uploads/2018/06/word-image-759-300x90.png 300w, /wp-content/uploads/2018/06/word-image-759-768x231.png 768w" sizes="(max-width: 915px) 100vw, 915px" /></p>
<p>一共五个推荐位：</p>
<p>上面的五个推荐位商品的都应该在正常的商品列表中（即不在回收站中），且为上架商品。</p>
<p>即字段is_delete = 0 and is_sale = 1。</p>
<p>五个推荐位：</p>
<p>疯狂抢购：按照自己商城一些特点取商品，如可以取出价格最低的几个。</p>
<p>热卖：即is_hot = 1</p>
<p>推荐：即is_best = 1</p>
<p>新品：即is_new = 1</p>
<p>猜你喜欢：随机取出几个商品,利用mysql的 rand()的随机函数，使用模型的方法order( ‘rand()’ )实现</p>
<p>代码如下：</p>
<ol>
<li>在home-Goods模型中定义一个获取指定类型商品的getTypeGoods方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1275" height="700" class="wp-image-8175" src="/wp-content/uploads/2018/06/word-image-760.png" srcset="/wp-content/uploads/2018/06/word-image-760.png 1275w, /wp-content/uploads/2018/06/word-image-760-300x165.png 300w, /wp-content/uploads/2018/06/word-image-760-768x422.png 768w, /wp-content/uploads/2018/06/word-image-760-1024x562.png 1024w" sizes="(max-width: 1275px) 100vw, 1275px" /></p>
<ol>
<li>在admin-indexController-index方法中获取对应类型的数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="914" height="652" class="wp-image-8176" src="/wp-content/uploads/2018/06/word-image-761.png" srcset="/wp-content/uploads/2018/06/word-image-761.png 914w, /wp-content/uploads/2018/06/word-image-761-300x214.png 300w, /wp-content/uploads/2018/06/word-image-761-768x548.png 768w" sizes="(max-width: 914px) 100vw, 914px" /></p>
<ol>
<li>模板中遍历数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1256" height="696" class="wp-image-8177" src="/wp-content/uploads/2018/06/word-image-762.png" srcset="/wp-content/uploads/2018/06/word-image-762.png 1256w, /wp-content/uploads/2018/06/word-image-762-300x166.png 300w, /wp-content/uploads/2018/06/word-image-762-768x426.png 768w, /wp-content/uploads/2018/06/word-image-762-1024x567.png 1024w" sizes="(max-width: 1256px) 100vw, 1256px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="874" height="249" class="wp-image-8178" src="/wp-content/uploads/2018/06/word-image-763.png" srcset="/wp-content/uploads/2018/06/word-image-763.png 874w, /wp-content/uploads/2018/06/word-image-763-300x85.png 300w, /wp-content/uploads/2018/06/word-image-763-768x219.png 768w" sizes="(max-width: 874px) 100vw, 874px" /></p>
<h1>三、完成前台会员的注册功能</h1>
<h2>1、相关的会员表分析</h2>
<p><img loading="lazy" decoding="async" width="971" height="284" class="wp-image-8179" src="/wp-content/uploads/2018/06/word-image-764.png" srcset="/wp-content/uploads/2018/06/word-image-764.png 971w, /wp-content/uploads/2018/06/word-image-764-300x88.png 300w, /wp-content/uploads/2018/06/word-image-764-768x225.png 768w" sizes="(max-width: 971px) 100vw, 971px" /></p>
<p>其中openid字段，是用于后面实现qq第三方登录用的。</p>
<h2>代码实现</h2>
<ol>
<li>定义member验证器和member模型</li>
</ol>
<p>member验证器：</p>
<p><img loading="lazy" decoding="async" width="911" height="632" class="wp-image-8180" src="/wp-content/uploads/2018/06/word-image-765.png" srcset="/wp-content/uploads/2018/06/word-image-765.png 911w, /wp-content/uploads/2018/06/word-image-765-300x208.png 300w, /wp-content/uploads/2018/06/word-image-765-768x533.png 768w" sizes="(max-width: 911px) 100vw, 911px" /></p>
<p>member模型：</p>
<p><img loading="lazy" decoding="async" width="995" height="419" class="wp-image-8181" src="/wp-content/uploads/2018/06/word-image-766.png" srcset="/wp-content/uploads/2018/06/word-image-766.png 995w, /wp-content/uploads/2018/06/word-image-766-300x126.png 300w, /wp-content/uploads/2018/06/word-image-766-768x323.png 768w" sizes="(max-width: 995px) 100vw, 995px" /></p>
<ol>
<li>设置注册模板register.html的表单name字段名称</li>
</ol>
<p><img loading="lazy" decoding="async" width="1161" height="709" class="wp-image-8182" src="/wp-content/uploads/2018/06/word-image-767.png" srcset="/wp-content/uploads/2018/06/word-image-767.png 1161w, /wp-content/uploads/2018/06/word-image-767-300x183.png 300w, /wp-content/uploads/2018/06/word-image-767-768x469.png 768w, /wp-content/uploads/2018/06/word-image-767-1024x625.png 1024w" sizes="(max-width: 1161px) 100vw, 1161px" /></p>
<p>3、在home-publicController-register方法中完成注册的实现</p>
<p><img loading="lazy" decoding="async" width="976" height="626" class="wp-image-8183" src="/wp-content/uploads/2018/06/word-image-768.png" srcset="/wp-content/uploads/2018/06/word-image-768.png 976w, /wp-content/uploads/2018/06/word-image-768-300x192.png 300w, /wp-content/uploads/2018/06/word-image-768-768x493.png 768w" sizes="(max-width: 976px) 100vw, 976px" /></p>
<h1>四、使用短信验证完成注册</h1>
<h2>1、短信验证技术介绍</h2>
<p><strong>应用场景：</strong></p>
<p>主要用于用户注册、身份确认、重要资料修改的短信认证以及生成订单成功短信的通知等。</p>
<p><img loading="lazy" decoding="async" width="732" height="208" class="wp-image-8184" src="/wp-content/uploads/2018/06/word-image-769.png" srcset="/wp-content/uploads/2018/06/word-image-769.png 732w, /wp-content/uploads/2018/06/word-image-769-300x85.png 300w" sizes="(max-width: 732px) 100vw, 732px" /></p>
<p>如百度利用手机号登录：</p>
<p><img loading="lazy" decoding="async" width="349" height="248" class="wp-image-8185" src="/wp-content/uploads/2018/06/word-image-770.png" srcset="/wp-content/uploads/2018/06/word-image-770.png 349w, /wp-content/uploads/2018/06/word-image-770-300x213.png 300w" sizes="(max-width: 349px) 100vw, 349px" /></p>
<p>如新浪手机邮箱注册验证</p>
<p><a href="/goto/ozwd" rel="nofollow">https://mail.sina.com.cn/register/regmail.php</a></p>
<p><img loading="lazy" decoding="async" width="502" height="434" class="wp-image-8186" src="/wp-content/uploads/2018/06/word-image-771.png" srcset="/wp-content/uploads/2018/06/word-image-771.png 502w, /wp-content/uploads/2018/06/word-image-771-300x259.png 300w" sizes="(max-width: 502px) 100vw, 502px" /></p>
<h2>2、发送短信的实现</h2>
<p>网站应用中的短信发送一般要借助第三方提供商提供的API接口来发送短信。而且大部分是要收费的，内容方面的规范检验也越来越严格，常常都需要按照事先审核过的短信模板来发送内容，否则无法发送成功。</p>
<p>目前国内有很多这方面的短信提供商，只不过收费标准和稳定性都不一样。所以我们优先选择能免费体验的平台 ，比如容联云通讯（官方网址是：<a href="/goto/4d4z" rel="nofollow">http://www.yuntongxun.com/</a>）。</p>
<p>还有接口网：<a href="/goto/thuu" rel="nofollow">http://www.106jiekou.com/</a> ，</p>
<p>如下是容联云通讯（<a href="/goto/4d4z" rel="nofollow">http://www.yuntongxun.com/</a> ）的界面</p>
<p><img loading="lazy" decoding="async" width="1273" height="154" class="wp-image-8187" src="/wp-content/uploads/2018/06/word-image-772.png" srcset="/wp-content/uploads/2018/06/word-image-772.png 1273w, /wp-content/uploads/2018/06/word-image-772-300x36.png 300w, /wp-content/uploads/2018/06/word-image-772-768x93.png 768w, /wp-content/uploads/2018/06/word-image-772-1024x124.png 1024w" sizes="(max-width: 1273px) 100vw, 1273px" /></p>
<h2>3、容联运通讯的使用</h2>
<h3>（1）注册账号</h3>
<p>地址：<a href="/goto/30gu" rel="nofollow">http://www.yuntongxun.com/user/reg/init</a></p>
<p><img loading="lazy" decoding="async" width="637" height="571" class="wp-image-8188" src="/wp-content/uploads/2018/06/word-image-773.png" srcset="/wp-content/uploads/2018/06/word-image-773.png 637w, /wp-content/uploads/2018/06/word-image-773-300x269.png 300w" sizes="(max-width: 637px) 100vw, 637px" /></p>
<p>2、注册成功登录后进入控制中心</p>
<p><img loading="lazy" decoding="async" width="1330" height="544" class="wp-image-8189" src="/wp-content/uploads/2018/06/word-image-774.png" srcset="/wp-content/uploads/2018/06/word-image-774.png 1330w, /wp-content/uploads/2018/06/word-image-774-300x123.png 300w, /wp-content/uploads/2018/06/word-image-774-768x314.png 768w, /wp-content/uploads/2018/06/word-image-774-1024x419.png 1024w" sizes="(max-width: 1330px) 100vw, 1330px" /></p>
<p>3、设置发送短信的测试手机号</p>
<p><img loading="lazy" decoding="async" width="1023" height="487" class="wp-image-8190" src="/wp-content/uploads/2018/06/word-image-775.png" srcset="/wp-content/uploads/2018/06/word-image-775.png 1023w, /wp-content/uploads/2018/06/word-image-775-300x143.png 300w, /wp-content/uploads/2018/06/word-image-775-768x366.png 768w" sizes="(max-width: 1023px) 100vw, 1023px" /></p>
<p>注意：只有填写测试的手机号才可以发送短信，通过身份证认证之后无限制。</p>
<h3>（2）查看开发文档和下载demo代码</h3>
<p>1、开发文档：</p>
<p><img loading="lazy" decoding="async" width="1089" height="422" class="wp-image-8191" src="/wp-content/uploads/2018/06/word-image-776.png" srcset="/wp-content/uploads/2018/06/word-image-776.png 1089w, /wp-content/uploads/2018/06/word-image-776-300x116.png 300w, /wp-content/uploads/2018/06/word-image-776-768x298.png 768w, /wp-content/uploads/2018/06/word-image-776-1024x397.png 1024w" sizes="(max-width: 1089px) 100vw, 1089px" /></p>
<p>2、进入demo示例，查看使如何使用</p>
<p><img loading="lazy" decoding="async" width="1061" height="525" class="wp-image-8192" src="/wp-content/uploads/2018/06/word-image-777.png" srcset="/wp-content/uploads/2018/06/word-image-777.png 1061w, /wp-content/uploads/2018/06/word-image-777-300x148.png 300w, /wp-content/uploads/2018/06/word-image-777-768x380.png 768w, /wp-content/uploads/2018/06/word-image-777-1024x507.png 1024w" sizes="(max-width: 1061px) 100vw, 1061px" /></p>
<p>下载后的DEMO文件：</p>
<p><img loading="lazy" decoding="async" width="549" height="179" class="wp-image-8193" src="/wp-content/uploads/2018/06/word-image-778.png" srcset="/wp-content/uploads/2018/06/word-image-778.png 549w, /wp-content/uploads/2018/06/word-image-778-300x98.png 300w" sizes="(max-width: 549px) 100vw, 549px" /></p>
<p>注：发送短信要开启PHP的curl模块，在php配置文件php.ini中开启</p>
<p><img loading="lazy" decoding="async" width="770" height="70" class="wp-image-8194" src="/wp-content/uploads/2018/06/word-image-779.png" srcset="/wp-content/uploads/2018/06/word-image-779.png 770w, /wp-content/uploads/2018/06/word-image-779-300x27.png 300w, /wp-content/uploads/2018/06/word-image-779-768x70.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></p>
<h3>（3）短信发送案例</h3>
<p>参考以下示例：</p>
<p><img loading="lazy" decoding="async" width="510" height="54" class="wp-image-8195" src="/wp-content/uploads/2018/06/word-image-780.png" srcset="/wp-content/uploads/2018/06/word-image-780.png 510w, /wp-content/uploads/2018/06/word-image-780-300x32.png 300w" sizes="(max-width: 510px) 100vw, 510px" /></p>
<h1>使用短信验证完成注册</h1>
<ol>
<li>上面演示代码放在虚拟主机中测试如果可以正常发送短信则把对应的文件夹sendSMS复制到我们[项目目录]/extend/目录下面：</li>
</ol>
<p><img loading="lazy" decoding="async" width="784" height="268" class="wp-image-8196" src="/wp-content/uploads/2018/06/word-image-781.png" srcset="/wp-content/uploads/2018/06/word-image-781.png 784w, /wp-content/uploads/2018/06/word-image-781-300x103.png 300w, /wp-content/uploads/2018/06/word-image-781-768x263.png 768w" sizes="(max-width: 784px) 100vw, 784px" /></p>
<p>只需要上面一个文件即可发送短信。</p>
<ol>
<li>封装一个发送短信的方法，封装在common.php</li>
</ol>
<p><img loading="lazy" decoding="async" width="1134" height="716" class="wp-image-8197" src="/wp-content/uploads/2018/06/word-image-782.png" srcset="/wp-content/uploads/2018/06/word-image-782.png 1134w, /wp-content/uploads/2018/06/word-image-782-300x189.png 300w, /wp-content/uploads/2018/06/word-image-782-768x485.png 768w, /wp-content/uploads/2018/06/word-image-782-1024x647.png 1024w" sizes="(max-width: 1134px) 100vw, 1134px" /></p>
<p>测试下是否可以发送短信：</p>
<p><img loading="lazy" decoding="async" width="864" height="263" class="wp-image-8198" src="/wp-content/uploads/2018/06/word-image-783.png" srcset="/wp-content/uploads/2018/06/word-image-783.png 864w, /wp-content/uploads/2018/06/word-image-783-300x91.png 300w, /wp-content/uploads/2018/06/word-image-783-768x234.png 768w" sizes="(max-width: 864px) 100vw, 864px" /></p>
<p>成功和失败返回如下数据：</p>
<p><img loading="lazy" decoding="async" width="744" height="284" class="wp-image-8199" src="/wp-content/uploads/2018/06/word-image-784.png" srcset="/wp-content/uploads/2018/06/word-image-784.png 744w, /wp-content/uploads/2018/06/word-image-784-300x115.png 300w" sizes="(max-width: 744px) 100vw, 744px" /></p>
<ol>
<li>在register.html注册的页面，设置发送短信的html布局</li>
</ol>
<p><img loading="lazy" decoding="async" width="1216" height="475" class="wp-image-8200" src="/wp-content/uploads/2018/06/word-image-785.png" srcset="/wp-content/uploads/2018/06/word-image-785.png 1216w, /wp-content/uploads/2018/06/word-image-785-300x117.png 300w, /wp-content/uploads/2018/06/word-image-785-768x300.png 768w, /wp-content/uploads/2018/06/word-image-785-1024x400.png 1024w" sizes="(max-width: 1216px) 100vw, 1216px" /></p>
<ol>
<li>给id=sendSms绑定单击事件，发送ajax请求，进行短信的发送</li>
</ol>
<p><img loading="lazy" decoding="async" width="1048" height="493" class="wp-image-8201" src="/wp-content/uploads/2018/06/word-image-786.png" srcset="/wp-content/uploads/2018/06/word-image-786.png 1048w, /wp-content/uploads/2018/06/word-image-786-300x141.png 300w, /wp-content/uploads/2018/06/word-image-786-768x361.png 768w, /wp-content/uploads/2018/06/word-image-786-1024x482.png 1024w" sizes="(max-width: 1048px) 100vw, 1048px" /></p>
<ol>
<li>在home-publicController-sendSms定义发送短信的方法</li>
</ol>
<p>先在config.php中加入一个短信盐：用于加密</p>
<p><img loading="lazy" decoding="async" width="664" height="217" class="wp-image-8202" src="/wp-content/uploads/2018/06/word-image-787.png" srcset="/wp-content/uploads/2018/06/word-image-787.png 664w, /wp-content/uploads/2018/06/word-image-787-300x98.png 300w" sizes="(max-width: 664px) 100vw, 664px" /></p>
<p>进行发送短信：</p>
<p><img loading="lazy" decoding="async" width="1231" height="459" class="wp-image-8203" src="/wp-content/uploads/2018/06/word-image-788.png" srcset="/wp-content/uploads/2018/06/word-image-788.png 1231w, /wp-content/uploads/2018/06/word-image-788-300x112.png 300w, /wp-content/uploads/2018/06/word-image-788-768x286.png 768w, /wp-content/uploads/2018/06/word-image-788-1024x382.png 1024w" sizes="(max-width: 1231px) 100vw, 1231px" /></p>
<p>同时定义一个验证:</p>
<p><img loading="lazy" decoding="async" width="998" height="697" class="wp-image-8204" src="/wp-content/uploads/2018/06/word-image-789.png" srcset="/wp-content/uploads/2018/06/word-image-789.png 998w, /wp-content/uploads/2018/06/word-image-789-300x210.png 300w, /wp-content/uploads/2018/06/word-image-789-768x536.png 768w" sizes="(max-width: 998px) 100vw, 998px" /></p>
<p>6、发送短信的倒计时特效:</p>
<p><img loading="lazy" decoding="async" width="1040" height="283" class="wp-image-8205" src="/wp-content/uploads/2018/06/word-image-790.png" srcset="/wp-content/uploads/2018/06/word-image-790.png 1040w, /wp-content/uploads/2018/06/word-image-790-300x82.png 300w, /wp-content/uploads/2018/06/word-image-790-768x209.png 768w, /wp-content/uploads/2018/06/word-image-790-1024x279.png 1024w" sizes="(max-width: 1040px) 100vw, 1040px" /></p>
<p>countDown倒计时方法代码如下：</p>
<p><img loading="lazy" decoding="async" width="972" height="491" class="wp-image-8206" src="/wp-content/uploads/2018/06/word-image-791.png" srcset="/wp-content/uploads/2018/06/word-image-791.png 972w, /wp-content/uploads/2018/06/word-image-791-300x152.png 300w, /wp-content/uploads/2018/06/word-image-791-768x388.png 768w" sizes="(max-width: 972px) 100vw, 972px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="512" height="112" class="wp-image-8207" src="/wp-content/uploads/2018/06/word-image-792.png" srcset="/wp-content/uploads/2018/06/word-image-792.png 512w, /wp-content/uploads/2018/06/word-image-792-300x66.png 300w" sizes="(max-width: 512px) 100vw, 512px" /></p>
<ol>
<li>同时点击注册按钮的时候，需要判断手机号短信验证码是否输入正确</li>
</ol>
<p><img loading="lazy" decoding="async" width="1084" height="559" class="wp-image-8208" src="/wp-content/uploads/2018/06/word-image-793.png" srcset="/wp-content/uploads/2018/06/word-image-793.png 1084w, /wp-content/uploads/2018/06/word-image-793-300x155.png 300w, /wp-content/uploads/2018/06/word-image-793-768x396.png 768w, /wp-content/uploads/2018/06/word-image-793-1024x528.png 1024w" sizes="(max-width: 1084px) 100vw, 1084px" /></p>
<h1>六、完成前台会员的登录和验证码功能</h1>
<p>1、先在member验证器中定义一个login的验证场景</p>
<p><img loading="lazy" decoding="async" width="992" height="674" class="wp-image-8209" src="/wp-content/uploads/2018/06/word-image-794.png" srcset="/wp-content/uploads/2018/06/word-image-794.png 992w, /wp-content/uploads/2018/06/word-image-794-300x204.png 300w, /wp-content/uploads/2018/06/word-image-794-768x522.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<ol>
<li>在Member模型中定义一个checkUser方法，判断用户名和密码是否正确</li>
</ol>
<p><img loading="lazy" decoding="async" width="894" height="399" class="wp-image-8210" src="/wp-content/uploads/2018/06/word-image-795.png" srcset="/wp-content/uploads/2018/06/word-image-795.png 894w, /wp-content/uploads/2018/06/word-image-795-300x134.png 300w, /wp-content/uploads/2018/06/word-image-795-768x343.png 768w" sizes="(max-width: 894px) 100vw, 894px" /></p>
<ol>
<li>在登录模板login.html设置表单的name名称</li>
</ol>
<p><img loading="lazy" decoding="async" width="1142" height="618" class="wp-image-8211" src="/wp-content/uploads/2018/06/word-image-796.png" srcset="/wp-content/uploads/2018/06/word-image-796.png 1142w, /wp-content/uploads/2018/06/word-image-796-300x162.png 300w, /wp-content/uploads/2018/06/word-image-796-768x416.png 768w, /wp-content/uploads/2018/06/word-image-796-1024x554.png 1024w" sizes="(max-width: 1142px) 100vw, 1142px" /></p>
<p>同时单击换一张更换验证码：</p>
<p><img loading="lazy" decoding="async" width="995" height="152" class="wp-image-8212" src="/wp-content/uploads/2018/06/word-image-797.png" srcset="/wp-content/uploads/2018/06/word-image-797.png 995w, /wp-content/uploads/2018/06/word-image-797-300x46.png 300w, /wp-content/uploads/2018/06/word-image-797-768x117.png 768w" sizes="(max-width: 995px) 100vw, 995px" /></p>
<p>注：上面生成验证码的时候，带了参数为2，在验证器验证的时候，记得带上对应的标识2.</p>
<p><img loading="lazy" decoding="async" width="339" height="41" class="wp-image-8213" src="/wp-content/uploads/2018/06/word-image-798.png" srcset="/wp-content/uploads/2018/06/word-image-798.png 339w, /wp-content/uploads/2018/06/word-image-798-300x36.png 300w" sizes="(max-width: 339px) 100vw, 339px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="556" height="205" class="wp-image-8214" src="/wp-content/uploads/2018/06/word-image-799.png" srcset="/wp-content/uploads/2018/06/word-image-799.png 556w, /wp-content/uploads/2018/06/word-image-799-300x111.png 300w" sizes="(max-width: 556px) 100vw, 556px" /></p>
<p>4、在home-publicController-login方法中完成登录模板的展示和登录的逻辑实现</p>
<p><img loading="lazy" decoding="async" width="1103" height="501" class="wp-image-8215" src="/wp-content/uploads/2018/06/word-image-800.png" srcset="/wp-content/uploads/2018/06/word-image-800.png 1103w, /wp-content/uploads/2018/06/word-image-800-300x136.png 300w, /wp-content/uploads/2018/06/word-image-800-768x349.png 768w, /wp-content/uploads/2018/06/word-image-800-1024x465.png 1024w" sizes="(max-width: 1103px) 100vw, 1103px" /></p>
<h1>七、退出功能，显示用户是否登录</h1>
<p>判断用户是否登录思想：</p>
<p><img loading="lazy" decoding="async" width="474" height="50" class="wp-image-8216" src="/wp-content/uploads/2018/06/word-image-801.png" srcset="/wp-content/uploads/2018/06/word-image-801.png 474w, /wp-content/uploads/2018/06/word-image-801-300x32.png 300w" sizes="(max-width: 474px) 100vw, 474px" /></p>
<p>当用户登录，显示退出的按钮</p>
<p>当用户未登录，显示登录和注册的按钮</p>
<p>做法：可以通过session进行判断</p>
<p>修改home-view-index-index.html模板内容：</p>
<p><img loading="lazy" decoding="async" width="1245" height="423" class="wp-image-8217" src="/wp-content/uploads/2018/06/word-image-802.png" srcset="/wp-content/uploads/2018/06/word-image-802.png 1245w, /wp-content/uploads/2018/06/word-image-802-300x102.png 300w, /wp-content/uploads/2018/06/word-image-802-768x261.png 768w, /wp-content/uploads/2018/06/word-image-802-1024x348.png 1024w" sizes="(max-width: 1245px) 100vw, 1245px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="273" height="61" class="wp-image-8218" src="/wp-content/uploads/2018/06/word-image-803.png" /></p>
<p>同时在home-publicController-logout方法中完成退出功能的实现</p>
<p><img loading="lazy" decoding="async" width="784" height="369" class="wp-image-8219" src="/wp-content/uploads/2018/06/word-image-804.png" srcset="/wp-content/uploads/2018/06/word-image-804.png 784w, /wp-content/uploads/2018/06/word-image-804-300x141.png 300w, /wp-content/uploads/2018/06/word-image-804-768x361.png 768w" sizes="(max-width: 784px) 100vw, 784px" /></p>
<h1>八、邮件技术实现密码找回</h1>
<h2>1、邮件发送概述</h2>
<h3>（1）邮件发送的原理</h3>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" width="993" height="380" class="wp-image-8220" src="/wp-content/uploads/2018/06/word-image-805.png" srcset="/wp-content/uploads/2018/06/word-image-805.png 993w, /wp-content/uploads/2018/06/word-image-805-300x115.png 300w, /wp-content/uploads/2018/06/word-image-805-768x294.png 768w" sizes="(max-width: 993px) 100vw, 993px" /></p>
<p>解释：</p>
<p>POP3：全名为“Post Office Protocol &#8211; Version 3”，即“邮局协议版本3”。是TCP/IP协议族中的一员，由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件，提供了SSL加密。</p>
<p>简单一句话，POP服务器是用来收信的。</p>
<h3>（2）SMTP协议（Simple Mail Transfer Protocol）</h3>
<p><a id="post-8157-_Toc449198636"></a> SMTP（Simple Mail Transfer Protocol）：</p>
<p>即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则，由它来控制信件的中转方式。</p>
<p>SMTP协议属于TCP/IP协议族，它帮助每台计算机在发送或中转信件时找到下一个目的地。</p>
<p>通过SMTP协议所指定的服务器,就可以把E－mail寄到收信人的服务器上了，整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器，用来发送或中转发出的电子邮件。</p>
<p>简单的说：　SMTP则是负责邮件服务器与邮件服务器之间的寄信的通讯协定（类似于http协议）</p>
<h2>2、如何实现邮件的发送</h2>
<p>（1）需要有邮件发送的第三方程序包，比如可以使用开源免费的PHPMailer</p>
<p><img loading="lazy" decoding="async" width="236" height="25" class="wp-image-8221" src="/wp-content/uploads/2018/06/word-image-806.png" /></p>
<p>（2）需要邮件服务器</p>
<p>利用互联网上的第三方免费邮件服务器，例如 163， qq等，有些大公司会自己搭建邮件服务器。</p>
<p>（3）需要在免费的邮件服务器里面（可以去注册163的），注册一个邮箱，进入邮箱后，要开通smtp服务。</p>
<p>以163为例，先注册一个邮箱账号。</p>
<p><img loading="lazy" decoding="async" width="691" height="616" class="wp-image-8222" src="/wp-content/uploads/2018/06/word-image-807.png" srcset="/wp-content/uploads/2018/06/word-image-807.png 691w, /wp-content/uploads/2018/06/word-image-807-300x267.png 300w" sizes="(max-width: 691px) 100vw, 691px" /></p>
<p>注册成功然后登录进入用户设置</p>
<p><img loading="lazy" decoding="async" width="950" height="304" class="wp-image-8223" src="/wp-content/uploads/2018/06/word-image-808.png" srcset="/wp-content/uploads/2018/06/word-image-808.png 950w, /wp-content/uploads/2018/06/word-image-808-300x96.png 300w, /wp-content/uploads/2018/06/word-image-808-768x246.png 768w" sizes="(max-width: 950px) 100vw, 950px" /></p>
<p>开通smtp服务</p>
<p><img loading="lazy" decoding="async" width="1107" height="644" class="wp-image-8224" src="/wp-content/uploads/2018/06/word-image-809.png" srcset="/wp-content/uploads/2018/06/word-image-809.png 1107w, /wp-content/uploads/2018/06/word-image-809-300x175.png 300w, /wp-content/uploads/2018/06/word-image-809-768x447.png 768w, /wp-content/uploads/2018/06/word-image-809-1024x596.png 1024w" sizes="(max-width: 1107px) 100vw, 1107px" /></p>
<p>设置客户端授权密码</p>
<p><img loading="lazy" decoding="async" width="987" height="529" class="wp-image-8225" src="/wp-content/uploads/2018/06/word-image-810.png" srcset="/wp-content/uploads/2018/06/word-image-810.png 987w, /wp-content/uploads/2018/06/word-image-810-300x161.png 300w, /wp-content/uploads/2018/06/word-image-810-768x412.png 768w" sizes="(max-width: 987px) 100vw, 987px" /></p>
<p>（4） php.ini配置文件中需要启用sockets扩展。</p>
<p><img loading="lazy" decoding="async" width="475" height="229" class="wp-image-8226" src="/wp-content/uploads/2018/06/word-image-811.png" srcset="/wp-content/uploads/2018/06/word-image-811.png 475w, /wp-content/uploads/2018/06/word-image-811-300x145.png 300w" sizes="(max-width: 475px) 100vw, 475px" /></p>
<p>记得重启apache服务器</p>
<h2>3、邮件发送案例</h2>
<p>参考以下示例：</p>
<p><img loading="lazy" decoding="async" width="264" height="48" class="wp-image-8227" src="/wp-content/uploads/2018/06/word-image-812.png" /></p>
<h2>集成到项目中实现忘记密码功能</h2>
<ol>
<li>把上面测试通过的发送邮件的sendEmail复制到[应用目录]/extend目录中</li>
</ol>
<p><img loading="lazy" decoding="async" width="509" height="208" class="wp-image-8228" src="/wp-content/uploads/2018/06/word-image-813.png" srcset="/wp-content/uploads/2018/06/word-image-813.png 509w, /wp-content/uploads/2018/06/word-image-813-300x123.png 300w" sizes="(max-width: 509px) 100vw, 509px" /></p>
<p>注：测试的时候，记得修改demo.php中的基本配置。</p>
<ol>
<li>在common.php文件中封装一个发送邮件的方法sendEmail</li>
</ol>
<p><img loading="lazy" decoding="async" width="1042" height="714" class="wp-image-8229" src="/wp-content/uploads/2018/06/word-image-814.png" srcset="/wp-content/uploads/2018/06/word-image-814.png 1042w, /wp-content/uploads/2018/06/word-image-814-300x206.png 300w, /wp-content/uploads/2018/06/word-image-814-768x526.png 768w, /wp-content/uploads/2018/06/word-image-814-1024x702.png 1024w" sizes="(max-width: 1042px) 100vw, 1042px" /></p>
<ol>
<li>记得测试一下是否ok</li>
</ol>
<p><img loading="lazy" decoding="async" width="1077" height="265" class="wp-image-8230" src="/wp-content/uploads/2018/06/word-image-815.png" srcset="/wp-content/uploads/2018/06/word-image-815.png 1077w, /wp-content/uploads/2018/06/word-image-815-300x74.png 300w, /wp-content/uploads/2018/06/word-image-815-768x189.png 768w, /wp-content/uploads/2018/06/word-image-815-1024x252.png 1024w" sizes="(max-width: 1077px) 100vw, 1077px" /></p>
<h2>实现登录的忘记密码功能</h2>
<p>找回密码的基本流程图解：</p>
<p><img loading="lazy" decoding="async" width="460" height="660" class="wp-image-8231" src="/wp-content/uploads/2018/06/word-image-816.png" srcset="/wp-content/uploads/2018/06/word-image-816.png 460w, /wp-content/uploads/2018/06/word-image-816-209x300.png 209w" sizes="(max-width: 460px) 100vw, 460px" /></p>
<ol>
<li>修改登录页面的忘记密码的链接地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1135" height="294" class="wp-image-8232" src="/wp-content/uploads/2018/06/word-image-817.png" srcset="/wp-content/uploads/2018/06/word-image-817.png 1135w, /wp-content/uploads/2018/06/word-image-817-300x78.png 300w, /wp-content/uploads/2018/06/word-image-817-768x199.png 768w, /wp-content/uploads/2018/06/word-image-817-1024x265.png 1024w" sizes="(max-width: 1135px) 100vw, 1135px" /></p>
<ol>
<li>在home-publicController-findpassword方法，展示一个输入注册时候的邮箱的模板显示。</li>
</ol>
<p>注:模板可以直接复制登录的login.html模板即可，稍做修改</p>
<p><img loading="lazy" decoding="async" width="1271" height="399" class="wp-image-8233" src="/wp-content/uploads/2018/06/word-image-818.png" srcset="/wp-content/uploads/2018/06/word-image-818.png 1271w, /wp-content/uploads/2018/06/word-image-818-300x94.png 300w, /wp-content/uploads/2018/06/word-image-818-768x241.png 768w, /wp-content/uploads/2018/06/word-image-818-1024x321.png 1024w" sizes="(max-width: 1271px) 100vw, 1271px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="471" height="161" class="wp-image-8234" src="/wp-content/uploads/2018/06/word-image-819.png" srcset="/wp-content/uploads/2018/06/word-image-819.png 471w, /wp-content/uploads/2018/06/word-image-819-300x103.png 300w" sizes="(max-width: 471px) 100vw, 471px" /></p>
<ol>
<li>给上面的按钮绑定单击事件，进行发送ajax，触发发送邮件。</li>
</ol>
<p><img loading="lazy" decoding="async" width="1032" height="380" class="wp-image-8235" src="/wp-content/uploads/2018/06/word-image-820.png" srcset="/wp-content/uploads/2018/06/word-image-820.png 1032w, /wp-content/uploads/2018/06/word-image-820-300x110.png 300w, /wp-content/uploads/2018/06/word-image-820-768x283.png 768w, /wp-content/uploads/2018/06/word-image-820-1024x377.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<ol>
<li>在home模块的PublicController控制器中的findPassword方法中判断是否是ajax请求，接收重置的邮箱，进行一些发送邮件前的判断</li>
</ol>
<p><img loading="lazy" decoding="async" width="1000" height="504" class="wp-image-8236" src="/wp-content/uploads/2018/06/word-image-821.png" srcset="/wp-content/uploads/2018/06/word-image-821.png 1000w, /wp-content/uploads/2018/06/word-image-821-300x151.png 300w, /wp-content/uploads/2018/06/word-image-821-768x387.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<ol>
<li>当输入的邮箱在系统中存在的时候，就进行发送邮件。</li>
</ol>
<p>明天讲！！</p>
<h2>6、验证邮件地址的合法性</h2>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8157.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP5 商城（六）邮件找回密码、QQ 互联、QQ 登录、分类列表页的面包屑导航、分类列表页左侧分类菜单</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8241.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8241.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 08 Jun 2018 00:35:46 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[QQ 互联]]></category>
		<category><![CDATA[QQ 登录]]></category>
		<category><![CDATA[分类列表页左侧分类菜单]]></category>
		<category><![CDATA[分类列表页的面包屑导航]]></category>
		<category><![CDATA[邮件找回密码]]></category>
		<guid isPermaLink="false">/?p=8241</guid>

					<description><![CDATA[商城第六天 一、邮件技术实现密码找回 1、邮件发送概述 （1）邮件发送的原理 &#160; 解释： POP3： [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>商城第六天</h1>
<h1>一、邮件技术实现密码找回</h1>
<h2>1、邮件发送概述</h2>
<h3>（1）邮件发送的原理</h3>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" width="993" height="380" class="wp-image-8242" src="/wp-content/uploads/2018/06/word-image-822.png" srcset="/wp-content/uploads/2018/06/word-image-822.png 993w, /wp-content/uploads/2018/06/word-image-822-300x115.png 300w, /wp-content/uploads/2018/06/word-image-822-768x294.png 768w" sizes="(max-width: 993px) 100vw, 993px" /></p>
<p>解释：</p>
<p>POP3：全名为“Post Office Protocol &#8211; Version 3”，即“邮局协议版本3”。是TCP/IP协议族中的一员，由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件，提供了SSL加密。</p>
<p>简单一句话，POP服务器是用来收信的。</p>
<h3>（2）SMTP协议（Simple Mail Transfer Protocol）</h3>
<p><a id="post-8241-_Toc449198636"></a> SMTP（Simple Mail Transfer Protocol）：</p>
<p>即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则，由它来控制信件的中转方式。</p>
<p>SMTP协议属于TCP/IP协议族，它帮助每台计算机在发送或中转信件时找到下一个目的地。</p>
<p>通过SMTP协议所指定的服务器,就可以把E－mail寄到收信人的服务器上了，整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器，用来发送或中转发出的电子邮件。</p>
<p>简单的说：　SMTP则是负责邮件服务器与邮件服务器之间的寄信的通讯协定（类似于http协议）</p>
<h2>2、如何实现邮件的发送</h2>
<p>（1）需要有邮件发送的第三方程序包，比如可以使用开源免费的PHPMailer</p>
<p><img loading="lazy" decoding="async" width="236" height="25" class="wp-image-8243" src="/wp-content/uploads/2018/06/word-image-823.png" /></p>
<p>（2）需要邮件服务器</p>
<p>利用互联网上的第三方免费邮件服务器，例如 163， qq等，有些大公司会自己搭建邮件服务器。</p>
<p>（3）需要在免费的邮件服务器里面（可以去注册163的），注册一个邮箱，进入邮箱后，要开通smtp服务。</p>
<p>以163为例，先注册一个邮箱账号。</p>
<p><img loading="lazy" decoding="async" width="691" height="616" class="wp-image-8244" src="/wp-content/uploads/2018/06/word-image-824.png" srcset="/wp-content/uploads/2018/06/word-image-824.png 691w, /wp-content/uploads/2018/06/word-image-824-300x267.png 300w" sizes="(max-width: 691px) 100vw, 691px" /></p>
<p>注册成功然后登录进入用户设置</p>
<p><img loading="lazy" decoding="async" width="950" height="304" class="wp-image-8245" src="/wp-content/uploads/2018/06/word-image-825.png" srcset="/wp-content/uploads/2018/06/word-image-825.png 950w, /wp-content/uploads/2018/06/word-image-825-300x96.png 300w, /wp-content/uploads/2018/06/word-image-825-768x246.png 768w" sizes="(max-width: 950px) 100vw, 950px" /></p>
<p>开通smtp服务</p>
<p><img loading="lazy" decoding="async" width="1107" height="644" class="wp-image-8246" src="/wp-content/uploads/2018/06/word-image-826.png" srcset="/wp-content/uploads/2018/06/word-image-826.png 1107w, /wp-content/uploads/2018/06/word-image-826-300x175.png 300w, /wp-content/uploads/2018/06/word-image-826-768x447.png 768w, /wp-content/uploads/2018/06/word-image-826-1024x596.png 1024w" sizes="(max-width: 1107px) 100vw, 1107px" /></p>
<p>设置客户端授权密码</p>
<p><img loading="lazy" decoding="async" width="987" height="529" class="wp-image-8247" src="/wp-content/uploads/2018/06/word-image-827.png" srcset="/wp-content/uploads/2018/06/word-image-827.png 987w, /wp-content/uploads/2018/06/word-image-827-300x161.png 300w, /wp-content/uploads/2018/06/word-image-827-768x412.png 768w" sizes="(max-width: 987px) 100vw, 987px" /></p>
<p>（4） php.ini配置文件中需要启用sockets扩展。</p>
<p><img loading="lazy" decoding="async" width="475" height="229" class="wp-image-8248" src="/wp-content/uploads/2018/06/word-image-828.png" srcset="/wp-content/uploads/2018/06/word-image-828.png 475w, /wp-content/uploads/2018/06/word-image-828-300x145.png 300w" sizes="(max-width: 475px) 100vw, 475px" /></p>
<p>记得重启apache服务器</p>
<h2>3、邮件发送案例</h2>
<p>参考以下示例：</p>
<p><img loading="lazy" decoding="async" width="264" height="48" class="wp-image-8249" src="/wp-content/uploads/2018/06/word-image-829.png" /></p>
<h2>集成到项目中实现忘记密码功能</h2>
<ol>
<li>把上面测试通过的发送邮件的sendEmail复制到[应用目录]/extend目录中</li>
</ol>
<p><img loading="lazy" decoding="async" width="509" height="208" class="wp-image-8250" src="/wp-content/uploads/2018/06/word-image-830.png" srcset="/wp-content/uploads/2018/06/word-image-830.png 509w, /wp-content/uploads/2018/06/word-image-830-300x123.png 300w" sizes="(max-width: 509px) 100vw, 509px" /></p>
<p>注：测试的时候，记得修改demo.php中的基本配置。</p>
<ol>
<li>在common.php文件中封装一个发送邮件的方法sendEmail</li>
</ol>
<p><img loading="lazy" decoding="async" width="1042" height="714" class="wp-image-8251" src="/wp-content/uploads/2018/06/word-image-831.png" srcset="/wp-content/uploads/2018/06/word-image-831.png 1042w, /wp-content/uploads/2018/06/word-image-831-300x206.png 300w, /wp-content/uploads/2018/06/word-image-831-768x526.png 768w, /wp-content/uploads/2018/06/word-image-831-1024x702.png 1024w" sizes="(max-width: 1042px) 100vw, 1042px" /></p>
<ol>
<li>记得测试一下是否ok</li>
</ol>
<p><img loading="lazy" decoding="async" width="1077" height="265" class="wp-image-8252" src="/wp-content/uploads/2018/06/word-image-832.png" srcset="/wp-content/uploads/2018/06/word-image-832.png 1077w, /wp-content/uploads/2018/06/word-image-832-300x74.png 300w, /wp-content/uploads/2018/06/word-image-832-768x189.png 768w, /wp-content/uploads/2018/06/word-image-832-1024x252.png 1024w" sizes="(max-width: 1077px) 100vw, 1077px" /></p>
<h2>实现登录的忘记密码功能</h2>
<p>找回密码的基本流程图解：</p>
<p><img loading="lazy" decoding="async" width="460" height="660" class="wp-image-8253" src="/wp-content/uploads/2018/06/word-image-833.png" srcset="/wp-content/uploads/2018/06/word-image-833.png 460w, /wp-content/uploads/2018/06/word-image-833-209x300.png 209w" sizes="(max-width: 460px) 100vw, 460px" /></p>
<ol>
<li>修改登录页面的忘记密码的链接地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1135" height="294" class="wp-image-8254" src="/wp-content/uploads/2018/06/word-image-834.png" srcset="/wp-content/uploads/2018/06/word-image-834.png 1135w, /wp-content/uploads/2018/06/word-image-834-300x78.png 300w, /wp-content/uploads/2018/06/word-image-834-768x199.png 768w, /wp-content/uploads/2018/06/word-image-834-1024x265.png 1024w" sizes="(max-width: 1135px) 100vw, 1135px" /></p>
<ol>
<li>在home-publicController-findpassword方法，展示一个输入注册时候的邮箱的模板显示。</li>
</ol>
<p>注:模板可以直接复制登录的login.html模板即可，稍做修改</p>
<p><img loading="lazy" decoding="async" width="1271" height="399" class="wp-image-8255" src="/wp-content/uploads/2018/06/word-image-835.png" srcset="/wp-content/uploads/2018/06/word-image-835.png 1271w, /wp-content/uploads/2018/06/word-image-835-300x94.png 300w, /wp-content/uploads/2018/06/word-image-835-768x241.png 768w, /wp-content/uploads/2018/06/word-image-835-1024x321.png 1024w" sizes="(max-width: 1271px) 100vw, 1271px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="471" height="161" class="wp-image-8256" src="/wp-content/uploads/2018/06/word-image-836.png" srcset="/wp-content/uploads/2018/06/word-image-836.png 471w, /wp-content/uploads/2018/06/word-image-836-300x103.png 300w" sizes="(max-width: 471px) 100vw, 471px" /></p>
<ol>
<li>给上面的按钮绑定单击事件，进行发送ajax，触发发送邮件。</li>
</ol>
<p><img loading="lazy" decoding="async" width="1032" height="380" class="wp-image-8257" src="/wp-content/uploads/2018/06/word-image-837.png" srcset="/wp-content/uploads/2018/06/word-image-837.png 1032w, /wp-content/uploads/2018/06/word-image-837-300x110.png 300w, /wp-content/uploads/2018/06/word-image-837-768x283.png 768w, /wp-content/uploads/2018/06/word-image-837-1024x377.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<ol>
<li>在home模块的PublicController控制器中的findPassword方法中判断是否是ajax请求，接收重置的邮箱，进行一些发送邮件前的判断</li>
</ol>
<p><img loading="lazy" decoding="async" width="1000" height="504" class="wp-image-8258" src="/wp-content/uploads/2018/06/word-image-838.png" srcset="/wp-content/uploads/2018/06/word-image-838.png 1000w, /wp-content/uploads/2018/06/word-image-838-300x151.png 300w, /wp-content/uploads/2018/06/word-image-838-768x387.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<ol>
<li>当输入的邮箱在系统中存在的时候，就进行发送邮件。</li>
</ol>
<p>需要把修改密码的链接地址构造起来一个a标签，发送给邮箱的用户：</p>
<p>类似于： php15商城&#8211; &lt;a href=”http://域名/修改密码的新地址”&gt;点我找回密码&lt;/a&gt;</p>
<p>获取当前网站的请求协议和域名：</p>
<p><img loading="lazy" decoding="async" width="409" height="82" class="wp-image-8259" src="/wp-content/uploads/2018/06/word-image-839.png" srcset="/wp-content/uploads/2018/06/word-image-839.png 409w, /wp-content/uploads/2018/06/word-image-839-300x60.png 300w" sizes="(max-width: 409px) 100vw, 409px" /> <img loading="lazy" decoding="async" width="1233" height="688" class="wp-image-8260" src="/wp-content/uploads/2018/06/word-image-840.png" srcset="/wp-content/uploads/2018/06/word-image-840.png 1233w, /wp-content/uploads/2018/06/word-image-840-300x167.png 300w, /wp-content/uploads/2018/06/word-image-840-768x429.png 768w, /wp-content/uploads/2018/06/word-image-840-1024x571.png 1024w" sizes="(max-width: 1233px) 100vw, 1233px" /></p>
<p>发送成功或失败，在html静态页面给出对应的提示：</p>
<p><img loading="lazy" decoding="async" width="1043" height="460" class="wp-image-8261" src="/wp-content/uploads/2018/06/word-image-841.png" srcset="/wp-content/uploads/2018/06/word-image-841.png 1043w, /wp-content/uploads/2018/06/word-image-841-300x132.png 300w, /wp-content/uploads/2018/06/word-image-841-768x339.png 768w, /wp-content/uploads/2018/06/word-image-841-1024x452.png 1024w" sizes="(max-width: 1043px) 100vw, 1043px" /></p>
<p>注：上面提示layer.msg需要引入layer弹出层插件</p>
<p>邮件收到的地址如下：</p>
<p><img loading="lazy" decoding="async" width="618" height="210" class="wp-image-8262" src="/wp-content/uploads/2018/06/word-image-842.png" srcset="/wp-content/uploads/2018/06/word-image-842.png 618w, /wp-content/uploads/2018/06/word-image-842-300x102.png 300w" sizes="(max-width: 618px) 100vw, 618px" /></p>
<ol>
<li>建立一个修改密码的方法updpassword。</li>
</ol>
<p><img loading="lazy" decoding="async" width="920" height="300" class="wp-image-8263" src="/wp-content/uploads/2018/06/word-image-843.png" srcset="/wp-content/uploads/2018/06/word-image-843.png 920w, /wp-content/uploads/2018/06/word-image-843-300x98.png 300w, /wp-content/uploads/2018/06/word-image-843-768x250.png 768w" sizes="(max-width: 920px) 100vw, 920px" /></p>
<p>模板内容如下：</p>
<p><img loading="lazy" decoding="async" width="1281" height="595" class="wp-image-8264" src="/wp-content/uploads/2018/06/word-image-844.png" srcset="/wp-content/uploads/2018/06/word-image-844.png 1281w, /wp-content/uploads/2018/06/word-image-844-300x139.png 300w, /wp-content/uploads/2018/06/word-image-844-768x357.png 768w, /wp-content/uploads/2018/06/word-image-844-1024x476.png 1024w" sizes="(max-width: 1281px) 100vw, 1281px" /> <img loading="lazy" decoding="async" width="520" height="246" class="wp-image-8265" src="/wp-content/uploads/2018/06/word-image-845.png" srcset="/wp-content/uploads/2018/06/word-image-845.png 520w, /wp-content/uploads/2018/06/word-image-845-300x142.png 300w" sizes="(max-width: 520px) 100vw, 520px" /></p>
<ol>
<li>给上面的id=updPassword绑定单击事件，发送ajax请求，修改密码</li>
</ol>
<p><img loading="lazy" decoding="async" width="1069" height="597" class="wp-image-8266" src="/wp-content/uploads/2018/06/word-image-846.png" srcset="/wp-content/uploads/2018/06/word-image-846.png 1069w, /wp-content/uploads/2018/06/word-image-846-300x168.png 300w, /wp-content/uploads/2018/06/word-image-846-768x429.png 768w, /wp-content/uploads/2018/06/word-image-846-1024x572.png 1024w" sizes="(max-width: 1069px) 100vw, 1069px" /></p>
<p>注：上面模板也要引入layer弹出层插件</p>
<ol>
<li>在updpassword中判断是否是ajax请求，完成修改用户的密码</li>
</ol>
<p><img loading="lazy" decoding="async" width="1047" height="604" class="wp-image-8267" src="/wp-content/uploads/2018/06/word-image-847.png" srcset="/wp-content/uploads/2018/06/word-image-847.png 1047w, /wp-content/uploads/2018/06/word-image-847-300x173.png 300w, /wp-content/uploads/2018/06/word-image-847-768x443.png 768w, /wp-content/uploads/2018/06/word-image-847-1024x591.png 1024w" sizes="(max-width: 1047px) 100vw, 1047px" /></p>
<p>同时在Memer模型的编辑的前钩子中完成密码的加密：</p>
<p><img loading="lazy" decoding="async" width="1001" height="416" class="wp-image-8268" src="/wp-content/uploads/2018/06/word-image-848.png" srcset="/wp-content/uploads/2018/06/word-image-848.png 1001w, /wp-content/uploads/2018/06/word-image-848-300x125.png 300w, /wp-content/uploads/2018/06/word-image-848-768x319.png 768w" sizes="(max-width: 1001px) 100vw, 1001px" /></p>
<h2>验证邮件地址的合法性</h2>
<ol>
<li>因为用户可以篡改邮件的链接地址，如把id=1的用户改为id=3的用于，这样就把其他用户的密码给修改了</li>
<li>还要保证链接地址有个有效期比如1天。</li>
</ol>
<p>具体做法：</p>
<ol>
<li>在发送邮件的时候，给携带携带3个参数，member_id、time、加密的字符串。</li>
</ol>
<p>加密的字符串是member_id和time和我们配置中一个配置项加密的结果。</p>
<p><img loading="lazy" decoding="async" width="1248" height="506" class="wp-image-8269" src="/wp-content/uploads/2018/06/word-image-849.png" srcset="/wp-content/uploads/2018/06/word-image-849.png 1248w, /wp-content/uploads/2018/06/word-image-849-300x122.png 300w, /wp-content/uploads/2018/06/word-image-849-768x311.png 768w, /wp-content/uploads/2018/06/word-image-849-1024x415.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<p>邮件地址生成的a链接地址如下：</p>
<p><a href="/goto/wto7" rel="nofollow">http://www.php15shop.com/home/public/updpassword/member_id/2/time/1529202630/hash/50730d397f3b07e62e52e4c5b5e1cf47</a></p>
<ol>
<li>在更新密码的updPassword方法中，判断邮件地址是否被篡改，且要在指定的有效期内</li>
</ol>
<p><img loading="lazy" decoding="async" width="1011" height="504" class="wp-image-8270" src="/wp-content/uploads/2018/06/word-image-850.png" srcset="/wp-content/uploads/2018/06/word-image-850.png 1011w, /wp-content/uploads/2018/06/word-image-850-300x150.png 300w, /wp-content/uploads/2018/06/word-image-850-768x383.png 768w" sizes="(max-width: 1011px) 100vw, 1011px" /></p>
<p>以后凡是防止用户篡改表单或者url中的参数，解决办法：加密后对比处理。</p>
<h1>二、QQ互联</h1>
<h2>1、注册QQ互联应用</h2>
<p>先去腾讯开发平台注册账号：<a href="/goto/efjr" rel="nofollow">http://open.qq.com/</a> 。</p>
<p><img loading="lazy" decoding="async" width="1342" height="240" class="wp-image-8271" src="/wp-content/uploads/2018/06/word-image-851.png" srcset="/wp-content/uploads/2018/06/word-image-851.png 1342w, /wp-content/uploads/2018/06/word-image-851-300x54.png 300w, /wp-content/uploads/2018/06/word-image-851-768x137.png 768w, /wp-content/uploads/2018/06/word-image-851-1024x183.png 1024w" sizes="(max-width: 1342px) 100vw, 1342px" /></p>
<p>等资料审核通过后便可去qq互联创建应用： <a href="/goto/p1rq" rel="nofollow">https://connect.qq.com/manage.html#/</a> ，创建好如下所示。</p>
<p><img loading="lazy" decoding="async" width="1048" height="604" class="wp-image-8272" src="/wp-content/uploads/2018/06/word-image-852.png" srcset="/wp-content/uploads/2018/06/word-image-852.png 1048w, /wp-content/uploads/2018/06/word-image-852-300x173.png 300w, /wp-content/uploads/2018/06/word-image-852-768x443.png 768w, /wp-content/uploads/2018/06/word-image-852-1024x590.png 1024w" sizes="(max-width: 1048px) 100vw, 1048px" /></p>
<p>点击上面的查看，进入以下页面：</p>
<p><img loading="lazy" decoding="async" width="1039" height="562" class="wp-image-8273" src="/wp-content/uploads/2018/06/word-image-853.png" srcset="/wp-content/uploads/2018/06/word-image-853.png 1039w, /wp-content/uploads/2018/06/word-image-853-300x162.png 300w, /wp-content/uploads/2018/06/word-image-853-768x415.png 768w, /wp-content/uploads/2018/06/word-image-853-1024x554.png 1024w" sizes="(max-width: 1039px) 100vw, 1039px" /></p>
<p>回调域设置：</p>
<p><img loading="lazy" decoding="async" width="899" height="379" class="wp-image-8274" src="/wp-content/uploads/2018/06/word-image-854.png" srcset="/wp-content/uploads/2018/06/word-image-854.png 899w, /wp-content/uploads/2018/06/word-image-854-300x126.png 300w, /wp-content/uploads/2018/06/word-image-854-768x324.png 768w" sizes="(max-width: 899px) 100vw, 899px" /></p>
<p>注意：</p>
<ol>
<li>上面的应用虽然审核不通过，但是不影响我们使用。我们只需要获取应用的appid和key即可。</li>
<li>只有网站备案通过，应用才可以审核通过，没通过审核的应用只能使用我们所注册的qq号进行登录测试，审核通过后就没限制。</li>
<li>当我们本地网站集成qq登录时，本地域名回调地址域需要和上面应用设置的一样。</li>
</ol>
<p>注意：</p>
<p>当应用创建好之后，立刻记住appid和appkey ,设置好和我们本地网站域名一样的回调域和回调地址。</p>
<h2>2、下载QQ登录PHP-SDK 集成包</h2>
<p>下载地址：<a href="/goto/il7d" rel="nofollow">http://wiki.connect.qq.com/</a></p>
<p><img loading="lazy" decoding="async" width="1073" height="691" class="wp-image-8275" src="/wp-content/uploads/2018/06/word-image-855.png" srcset="/wp-content/uploads/2018/06/word-image-855.png 1073w, /wp-content/uploads/2018/06/word-image-855-300x193.png 300w, /wp-content/uploads/2018/06/word-image-855-768x495.png 768w, /wp-content/uploads/2018/06/word-image-855-1024x659.png 1024w" sizes="(max-width: 1073px) 100vw, 1073px" /></p>
<p>下载php版本：</p>
<p><img loading="lazy" decoding="async" width="1148" height="484" class="wp-image-8276" src="/wp-content/uploads/2018/06/word-image-856.png" srcset="/wp-content/uploads/2018/06/word-image-856.png 1148w, /wp-content/uploads/2018/06/word-image-856-300x126.png 300w, /wp-content/uploads/2018/06/word-image-856-768x324.png 768w, /wp-content/uploads/2018/06/word-image-856-1024x432.png 1024w" sizes="(max-width: 1148px) 100vw, 1148px" /></p>
<p>下载下来如下所示：</p>
<p><img loading="lazy" decoding="async" width="271" height="29" class="wp-image-8277" src="/wp-content/uploads/2018/06/word-image-857.png" /></p>
<h2>进行QQ登录前的参数配置</h2>
<p>1、把qq登录开发包SDK中的以下目录复制到网站根目录下,即[应用目录]/public/中</p>
<p><img loading="lazy" decoding="async" width="752" height="349" class="wp-image-8278" src="/wp-content/uploads/2018/06/word-image-858.png" srcset="/wp-content/uploads/2018/06/word-image-858.png 752w, /wp-content/uploads/2018/06/word-image-858-300x139.png 300w" sizes="(max-width: 752px) 100vw, 752px" /></p>
<ol>
<li>直接在浏览器中访问connect2.1目录中即可</li>
</ol>
<p><img loading="lazy" decoding="async" width="553" height="155" class="wp-image-8279" src="/wp-content/uploads/2018/06/word-image-859.png" srcset="/wp-content/uploads/2018/06/word-image-859.png 553w, /wp-content/uploads/2018/06/word-image-859-300x84.png 300w" sizes="(max-width: 553px) 100vw, 553px" /></p>
<p>点击上面的设置配置项。</p>
<p><img loading="lazy" decoding="async" width="1108" height="489" class="wp-image-8280" src="/wp-content/uploads/2018/06/word-image-860.png" srcset="/wp-content/uploads/2018/06/word-image-860.png 1108w, /wp-content/uploads/2018/06/word-image-860-300x132.png 300w, /wp-content/uploads/2018/06/word-image-860-768x339.png 768w, /wp-content/uploads/2018/06/word-image-860-1024x452.png 1024w" sizes="(max-width: 1108px) 100vw, 1108px" /></p>
<p>进入如下：</p>
<p><img loading="lazy" decoding="async" width="1014" height="187" class="wp-image-8281" src="/wp-content/uploads/2018/06/word-image-861.png" srcset="/wp-content/uploads/2018/06/word-image-861.png 1014w, /wp-content/uploads/2018/06/word-image-861-300x55.png 300w, /wp-content/uploads/2018/06/word-image-861-768x142.png 768w" sizes="(max-width: 1014px) 100vw, 1014px" /></p>
<p>点击上面的example,，点击qq登录登录的logo图标，如果能够有一个qq登录的弹框说明配置成功</p>
<p><img loading="lazy" decoding="async" width="981" height="452" class="wp-image-8282" src="/wp-content/uploads/2018/06/word-image-862.png" srcset="/wp-content/uploads/2018/06/word-image-862.png 981w, /wp-content/uploads/2018/06/word-image-862-300x138.png 300w, /wp-content/uploads/2018/06/word-image-862-768x354.png 768w" sizes="(max-width: 981px) 100vw, 981px" /></p>
<p>注意：我们应用中的域名如果备案审核通过，则只能用我们所注册的qq进行登录测试</p>
<p>用注册的qq登录成功之后，会进入到我们之前所设置的callback回调地址</p>
<p><img loading="lazy" decoding="async" width="1120" height="173" class="wp-image-8283" src="/wp-content/uploads/2018/06/word-image-863.png" srcset="/wp-content/uploads/2018/06/word-image-863.png 1120w, /wp-content/uploads/2018/06/word-image-863-300x46.png 300w, /wp-content/uploads/2018/06/word-image-863-768x119.png 768w, /wp-content/uploads/2018/06/word-image-863-1024x158.png 1024w" sizes="(max-width: 1120px) 100vw, 1120px" /></p>
<h2>分析如何唤起QQ登录弹框</h2>
<p>分析qq图标的logo按钮</p>
<p><img loading="lazy" decoding="async" width="676" height="398" class="wp-image-8284" src="/wp-content/uploads/2018/06/word-image-864.png" srcset="/wp-content/uploads/2018/06/word-image-864.png 676w, /wp-content/uploads/2018/06/word-image-864-300x177.png 300w" sizes="(max-width: 676px) 100vw, 676px" /></p>
<p>再去对应的文件中查看toQzoneLogin()事件：</p>
<p><img loading="lazy" decoding="async" width="1064" height="323" class="wp-image-8285" src="/wp-content/uploads/2018/06/word-image-865.png" srcset="/wp-content/uploads/2018/06/word-image-865.png 1064w, /wp-content/uploads/2018/06/word-image-865-300x91.png 300w, /wp-content/uploads/2018/06/word-image-865-768x233.png 768w, /wp-content/uploads/2018/06/word-image-865-1024x311.png 1024w" sizes="(max-width: 1064px) 100vw, 1064px" /></p>
<p>可见事件在一个新窗口打开oauth 中的index.php。找到此文件</p>
<p><img loading="lazy" decoding="async" width="738" height="188" class="wp-image-8286" src="/wp-content/uploads/2018/06/word-image-866.png" srcset="/wp-content/uploads/2018/06/word-image-866.png 738w, /wp-content/uploads/2018/06/word-image-866-300x76.png 300w" sizes="(max-width: 738px) 100vw, 738px" /></p>
<p>可见，以上3行代码最终唤起qq登录弹框！。后面在项目中，点击qq登录的logo图标执行这三行代码即可完成qq登录弹框。</p>
<h2>5、集成到项目中实现QQ登录</h2>
<p>qq登录流程图：</p>
<p><img loading="lazy" decoding="async" width="1191" height="408" class="wp-image-8287" src="/wp-content/uploads/2018/06/word-image-867.png" srcset="/wp-content/uploads/2018/06/word-image-867.png 1191w, /wp-content/uploads/2018/06/word-image-867-300x103.png 300w, /wp-content/uploads/2018/06/word-image-867-768x263.png 768w, /wp-content/uploads/2018/06/word-image-867-1024x351.png 1024w" sizes="(max-width: 1191px) 100vw, 1191px" /></p>
<h3>1、点击qq登录的图片，唤起qq登录弹框</h3>
<ol>
<li>把之前测好的API目录复制到extend/qqLogin/目录下面</li>
</ol>
<p><img loading="lazy" decoding="async" width="736" height="205" class="wp-image-8288" src="/wp-content/uploads/2018/06/word-image-868.png" srcset="/wp-content/uploads/2018/06/word-image-868.png 736w, /wp-content/uploads/2018/06/word-image-868-300x84.png 300w" sizes="(max-width: 736px) 100vw, 736px" /></p>
<p>注：如果之前的配置参数写错了，可以直接修改inc.php文件</p>
<p><img loading="lazy" decoding="async" width="1270" height="164" class="wp-image-8289" src="/wp-content/uploads/2018/06/word-image-869.png" srcset="/wp-content/uploads/2018/06/word-image-869.png 1270w, /wp-content/uploads/2018/06/word-image-869-300x39.png 300w, /wp-content/uploads/2018/06/word-image-869-768x99.png 768w, /wp-content/uploads/2018/06/word-image-869-1024x132.png 1024w" sizes="(max-width: 1270px) 100vw, 1270px" /></p>
<ol>
<li>在login.html的登录模板给qq的登录图标，设置一个url地址，跳到home-memberController-qqLogin方法：</li>
</ol>
<p><img loading="lazy" decoding="async" width="1266" height="345" class="wp-image-8290" src="/wp-content/uploads/2018/06/word-image-870.png" srcset="/wp-content/uploads/2018/06/word-image-870.png 1266w, /wp-content/uploads/2018/06/word-image-870-300x82.png 300w, /wp-content/uploads/2018/06/word-image-870-768x209.png 768w, /wp-content/uploads/2018/06/word-image-870-1024x279.png 1024w" sizes="(max-width: 1266px) 100vw, 1266px" /></p>
<p>qqLogin方法如下：</p>
<p><img loading="lazy" decoding="async" width="931" height="362" class="wp-image-8291" src="/wp-content/uploads/2018/06/word-image-871.png" srcset="/wp-content/uploads/2018/06/word-image-871.png 931w, /wp-content/uploads/2018/06/word-image-871-300x117.png 300w, /wp-content/uploads/2018/06/word-image-871-768x299.png 768w" sizes="(max-width: 931px) 100vw, 931px" /></p>
<p>点击下面的qq登录，出现qq弹框说明引入项目成功：</p>
<p><img loading="lazy" decoding="async" width="553" height="142" class="wp-image-8292" src="/wp-content/uploads/2018/06/word-image-872.png" srcset="/wp-content/uploads/2018/06/word-image-872.png 553w, /wp-content/uploads/2018/06/word-image-872-300x77.png 300w" sizes="(max-width: 553px) 100vw, 553px" /> <img loading="lazy" decoding="async" width="738" height="364" class="wp-image-8293" src="/wp-content/uploads/2018/06/word-image-873.png" srcset="/wp-content/uploads/2018/06/word-image-873.png 738w, /wp-content/uploads/2018/06/word-image-873-300x148.png 300w" sizes="(max-width: 738px) 100vw, 738px" /></p>
<h3>在qq回调域callback中获取openid和token</h3>
<ol>
<li>在home模块member控制器中建立一个qq回调方法名为qqCallback</li>
</ol>
<p><img loading="lazy" decoding="async" width="1043" height="529" class="wp-image-8294" src="/wp-content/uploads/2018/06/word-image-874.png" srcset="/wp-content/uploads/2018/06/word-image-874.png 1043w, /wp-content/uploads/2018/06/word-image-874-300x152.png 300w, /wp-content/uploads/2018/06/word-image-874-768x390.png 768w, /wp-content/uploads/2018/06/word-image-874-1024x519.png 1024w" sizes="(max-width: 1043px) 100vw, 1043px" /></p>
<p>获取到openid和token和qq用户相关的信息如下：</p>
<p><img loading="lazy" decoding="async" width="1209" height="716" class="wp-image-8295" src="/wp-content/uploads/2018/06/word-image-875.png" srcset="/wp-content/uploads/2018/06/word-image-875.png 1209w, /wp-content/uploads/2018/06/word-image-875-300x178.png 300w, /wp-content/uploads/2018/06/word-image-875-768x455.png 768w, /wp-content/uploads/2018/06/word-image-875-1024x606.png 1024w" sizes="(max-width: 1209px) 100vw, 1209px" /></p>
<h3>实现qq完成系统的登录</h3>
<p>在前台会员表sh_member中加一个字段nickname在，记录用户登录成功的昵称。</p>
<p><img loading="lazy" decoding="async" width="548" height="218" class="wp-image-8296" src="/wp-content/uploads/2018/06/word-image-876.png" srcset="/wp-content/uploads/2018/06/word-image-876.png 548w, /wp-content/uploads/2018/06/word-image-876-300x119.png 300w" sizes="(max-width: 548px) 100vw, 548px" /></p>
<p>1、先去系统中判断有没有此qq的openid 。做不同的业务逻辑</p>
<p><img loading="lazy" decoding="async" width="714" height="296" class="wp-image-8297" src="/wp-content/uploads/2018/06/word-image-877.png" srcset="/wp-content/uploads/2018/06/word-image-877.png 714w, /wp-content/uploads/2018/06/word-image-877-300x124.png 300w" sizes="(max-width: 714px) 100vw, 714px" /></p>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="826" height="708" class="wp-image-8298" src="/wp-content/uploads/2018/06/word-image-878.png" srcset="/wp-content/uploads/2018/06/word-image-878.png 826w, /wp-content/uploads/2018/06/word-image-878-300x257.png 300w, /wp-content/uploads/2018/06/word-image-878-768x658.png 768w" sizes="(max-width: 826px) 100vw, 826px" /></p>
<p>注：需要在member模型的入库的前钩子中，对密码加密进行判断，因为qq登录没有密码</p>
<p><img loading="lazy" decoding="async" width="824" height="423" class="wp-image-8299" src="/wp-content/uploads/2018/06/word-image-879.png" srcset="/wp-content/uploads/2018/06/word-image-879.png 824w, /wp-content/uploads/2018/06/word-image-879-300x154.png 300w, /wp-content/uploads/2018/06/word-image-879-768x394.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></p>
<p>登录成功效果：</p>
<p><img loading="lazy" decoding="async" width="488" height="121" class="wp-image-8300" src="/wp-content/uploads/2018/06/word-image-880.png" srcset="/wp-content/uploads/2018/06/word-image-880.png 488w, /wp-content/uploads/2018/06/word-image-880-300x74.png 300w" sizes="(max-width: 488px) 100vw, 488px" /></p>
<h1>三、完成分类列表页的面包屑导航</h1>
<p>如下：</p>
<p><img loading="lazy" decoding="async" width="918" height="182" class="wp-image-8301" src="/wp-content/uploads/2018/06/word-image-881.png" srcset="/wp-content/uploads/2018/06/word-image-881.png 918w, /wp-content/uploads/2018/06/word-image-881-300x59.png 300w, /wp-content/uploads/2018/06/word-image-881-768x152.png 768w" sizes="(max-width: 918px) 100vw, 918px" /></p>
<p>面包屑导航就是找当前分类的父分类。</p>
<p>核心：</p>
<p>找子分类：传递当前分类的cat_id,进行递归查找。</p>
<p>找父分类：传递当前分类的pid,进行递归查找。</p>
<p>代码</p>
<ol>
<li>设置好首页的分类的链接地址：以三级分类筛选地址为例：</li>
</ol>
<p><img loading="lazy" decoding="async" width="1262" height="623" class="wp-image-8302" src="/wp-content/uploads/2018/06/word-image-882.png" srcset="/wp-content/uploads/2018/06/word-image-882.png 1262w, /wp-content/uploads/2018/06/word-image-882-300x148.png 300w, /wp-content/uploads/2018/06/word-image-882-768x379.png 768w, /wp-content/uploads/2018/06/word-image-882-1024x506.png 1024w" sizes="(max-width: 1262px) 100vw, 1262px" /></p>
<ol>
<li>在home-CategoryController-index方法，取出当前分类的面包屑导航相关数据，并分配到模板中</li>
</ol>
<p><img loading="lazy" decoding="async" width="859" height="395" class="wp-image-8303" src="/wp-content/uploads/2018/06/word-image-883.png" srcset="/wp-content/uploads/2018/06/word-image-883.png 859w, /wp-content/uploads/2018/06/word-image-883-300x138.png 300w, /wp-content/uploads/2018/06/word-image-883-768x353.png 768w" sizes="(max-width: 859px) 100vw, 859px" /></p>
<p>同时在home模块的Category模型中定义一个getFamilyCats的方法，获取父分类</p>
<p><img loading="lazy" decoding="async" width="1034" height="600" class="wp-image-8304" src="/wp-content/uploads/2018/06/word-image-884.png" srcset="/wp-content/uploads/2018/06/word-image-884.png 1034w, /wp-content/uploads/2018/06/word-image-884-300x174.png 300w, /wp-content/uploads/2018/06/word-image-884-768x446.png 768w, /wp-content/uploads/2018/06/word-image-884-1024x594.png 1024w" sizes="(max-width: 1034px) 100vw, 1034px" /></p>
<ol>
<li>模板中遍历数据</li>
</ol>
<p>模板复制前台模板的list.html到 /home/view/category/目录下，并改名为index.html</p>
<p><img loading="lazy" decoding="async" width="592" height="486" class="wp-image-8305" src="/wp-content/uploads/2018/06/word-image-885.png" srcset="/wp-content/uploads/2018/06/word-image-885.png 592w, /wp-content/uploads/2018/06/word-image-885-300x246.png 300w" sizes="(max-width: 592px) 100vw, 592px" /></p>
<p>遍历数据：</p>
<p><img loading="lazy" decoding="async" width="1256" height="427" class="wp-image-8306" src="/wp-content/uploads/2018/06/word-image-886.png" srcset="/wp-content/uploads/2018/06/word-image-886.png 1256w, /wp-content/uploads/2018/06/word-image-886-300x102.png 300w, /wp-content/uploads/2018/06/word-image-886-768x261.png 768w, /wp-content/uploads/2018/06/word-image-886-1024x348.png 1024w" sizes="(max-width: 1256px) 100vw, 1256px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="352" height="97" class="wp-image-8307" src="/wp-content/uploads/2018/06/word-image-887.png" srcset="/wp-content/uploads/2018/06/word-image-887.png 352w, /wp-content/uploads/2018/06/word-image-887-300x83.png 300w" sizes="(max-width: 352px) 100vw, 352px" /></p>
<h1>四、实现分类列表页左侧分类菜单</h1>
<h3>分析</h3>
<p>思路：</p>
<p>不管点击哪一个分类到此分类列表页，下图的蓝色区域都是当前分类的最顶级分类。</p>
<p>蓝色顶级分类下面含有二级分类，二级分类下又包含三级分类。</p>
<p>如下：</p>
<p>顶级分类：电脑办公</p>
<p>二级分类：电脑整机、电脑配件、办公打印等</p>
<p>三级分类：如电脑整机下有笔记本、超极本、平板电脑</p>
<p><img loading="lazy" decoding="async" width="233" height="316" class="wp-image-8308" src="/wp-content/uploads/2018/06/word-image-888.png" srcset="/wp-content/uploads/2018/06/word-image-888.png 233w, /wp-content/uploads/2018/06/word-image-888-221x300.png 221w" sizes="(max-width: 233px) 100vw, 233px" /></p>
<h3>代码实现</h3>
<ol>
<li>在index方法中取出所有的分类，以cat_id 为二维数组下标，把每个元素通过pid进行分组</li>
</ol>
<p><img loading="lazy" decoding="async" width="897" height="672" class="wp-image-8309" src="/wp-content/uploads/2018/06/word-image-889.png" srcset="/wp-content/uploads/2018/06/word-image-889.png 897w, /wp-content/uploads/2018/06/word-image-889-300x225.png 300w, /wp-content/uploads/2018/06/word-image-889-768x575.png 768w" sizes="(max-width: 897px) 100vw, 897px" /></p>
<ol>
<li>模板中遍历数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1224" height="508" class="wp-image-8310" src="/wp-content/uploads/2018/06/word-image-890.png" srcset="/wp-content/uploads/2018/06/word-image-890.png 1224w, /wp-content/uploads/2018/06/word-image-890-300x125.png 300w, /wp-content/uploads/2018/06/word-image-890-768x319.png 768w, /wp-content/uploads/2018/06/word-image-890-1024x425.png 1024w" sizes="(max-width: 1224px) 100vw, 1224px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="241" height="276" class="wp-image-8311" src="/wp-content/uploads/2018/06/word-image-891.png" /></p>
<h1>五、完成分类列表页商品的展示</h1>
<h3>分析</h3>
<p>当点击某个分类的时候，应该把当前分类及其子孙分类下面的所有商品取出来。</p>
<p>如：当点击华为手机分类的时候，应该把华为分类下面的所有的商品取出来。</p>
<p>如：当点击国内手机分类时，应该把国内手机分类下面的所有的子孙分类的商品都取出来</p>
<h3>代码实现</h3>
<p>1、在home-categoryController-index方法中，取出当前分类及其子孙分类所有的商品</p>
<p>2、模板中遍历</p>
<p><img loading="lazy" decoding="async" width="1194" height="542" class="wp-image-8312" src="/wp-content/uploads/2018/06/word-image-892.png" srcset="/wp-content/uploads/2018/06/word-image-892.png 1194w, /wp-content/uploads/2018/06/word-image-892-300x136.png 300w, /wp-content/uploads/2018/06/word-image-892-768x349.png 768w, /wp-content/uploads/2018/06/word-image-892-1024x465.png 1024w" sizes="(max-width: 1194px) 100vw, 1194px" /> <img loading="lazy" decoding="async" width="1336" height="399" class="wp-image-8313" src="/wp-content/uploads/2018/06/word-image-893.png" srcset="/wp-content/uploads/2018/06/word-image-893.png 1336w, /wp-content/uploads/2018/06/word-image-893-300x90.png 300w, /wp-content/uploads/2018/06/word-image-893-768x229.png 768w, /wp-content/uploads/2018/06/word-image-893-1024x306.png 1024w" sizes="(max-width: 1336px) 100vw, 1336px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="985" height="328" class="wp-image-8314" src="/wp-content/uploads/2018/06/word-image-894.png" srcset="/wp-content/uploads/2018/06/word-image-894.png 985w, /wp-content/uploads/2018/06/word-image-894-300x100.png 300w, /wp-content/uploads/2018/06/word-image-894-768x256.png 768w" sizes="(max-width: 985px) 100vw, 985px" /></p>
<h1>六、完成商品详情页</h1>
<h2>1、实现商品详情页面包屑导航</h2>
<h2>2、商品基本数据的展示</h2>
<h2>3、实现商品详情页中的图片画廊的展示</h2>
<h2>4、实现商品详情页属性的展示</h2>
<h3>分析</h3>
<p>单选属性：</p>
<p><img loading="lazy" decoding="async" width="662" height="241" class="wp-image-8315" src="/wp-content/uploads/2018/06/word-image-895.png" srcset="/wp-content/uploads/2018/06/word-image-895.png 662w, /wp-content/uploads/2018/06/word-image-895-300x109.png 300w" sizes="(max-width: 662px) 100vw, 662px" /></p>
<p>注意一点：</p>
<p>因为单选属性的值可能有多个，所以我们可以把根据属性的attr_id进行分组，把相同属性的attr_id的值归为同一组，方便在模板中进行循环遍历。</p>
<p>唯一属性：</p>
<p><img loading="lazy" decoding="async" width="858" height="178" class="wp-image-8316" src="/wp-content/uploads/2018/06/word-image-896.png" srcset="/wp-content/uploads/2018/06/word-image-896.png 858w, /wp-content/uploads/2018/06/word-image-896-300x62.png 300w, /wp-content/uploads/2018/06/word-image-896-768x159.png 768w" sizes="(max-width: 858px) 100vw, 858px" /></p>
<p>唯一属性不需要分组，因为唯一属性的值只有一个。</p>
<h3>代码实现</h3>
<h2>5、实现商品详情页的浏览历史</h2>
<h3>分析</h3>
<p><img loading="lazy" decoding="async" width="290" height="182" class="wp-image-8317" src="/wp-content/uploads/2018/06/word-image-897.png" /></p>
<p>基本思路：</p>
<p>①可以使用cookie技术来实现浏览商品历史的存储，cookie中存储商品的goods_id即可。</p>
<p>只所以只存储浏览商品的id，因为商品的价格后面可能随时会变化，且记录一般存储3-5个。</p>
<p>②最新访问的商品应该放置在浏览历史的第一个位置</p>
<p>③当浏览历史存储量到达最大值（如超过5），应把最早访问的商品id给移除。</p>
<p>④当访问相同商品的时候，只保留最后访问的商品，即数组需要删除重复的元素。</p>
<p>cookie怎么存储所访问商品的id: 我们把访问商品的id存进数组中，再把数组写入到cookie中，形式如：[1,4,6,2,8]。</p>
<h3>代码实现</h3>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8241.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP5商城（七）商品详情页、商品基本数据、面包屑导航、商品图片画廊展示、商品详情页属性、浏览历史、购物车、ajax添加商品至购物车</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8321.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8321.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 08 Jun 2018 00:34:40 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[ajax添加商品至购物车]]></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=8321</guid>

					<description><![CDATA[商城第七天 一、完成商品详情页 1、实现商品详情页展示 1、需要修改前台首页和前台分类列表页商品的链接地址，跳 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>商城第七天</h1>
<h1>一、完成商品详情页</h1>
<h2>1、实现商品详情页展示</h2>
<p>1、需要修改前台首页和前台分类列表页商品的链接地址，跳转到对应的商品详情页</p>
<p><img loading="lazy" decoding="async" width="1269" height="479" class="wp-image-8322" src="/wp-content/uploads/2018/06/word-image-898.png" srcset="/wp-content/uploads/2018/06/word-image-898.png 1269w, /wp-content/uploads/2018/06/word-image-898-300x113.png 300w, /wp-content/uploads/2018/06/word-image-898-768x290.png 768w, /wp-content/uploads/2018/06/word-image-898-1024x387.png 1024w" sizes="(max-width: 1269px) 100vw, 1269px" /></p>
<p>其他商品的链接地址等同。</p>
<ol>
<li>在前台home的GoodsController建立一个detail的方法，输出模板内容</li>
</ol>
<p><img loading="lazy" decoding="async" width="857" height="300" class="wp-image-8323" src="/wp-content/uploads/2018/06/word-image-899.png" srcset="/wp-content/uploads/2018/06/word-image-899.png 857w, /wp-content/uploads/2018/06/word-image-899-300x105.png 300w, /wp-content/uploads/2018/06/word-image-899-768x269.png 768w" sizes="(max-width: 857px) 100vw, 857px" /></p>
<p>复制对应的模板内容：</p>
<p><img loading="lazy" decoding="async" width="743" height="373" class="wp-image-8324" src="/wp-content/uploads/2018/06/word-image-900.png" srcset="/wp-content/uploads/2018/06/word-image-900.png 743w, /wp-content/uploads/2018/06/word-image-900-300x151.png 300w" sizes="(max-width: 743px) 100vw, 743px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="1142" height="499" class="wp-image-8325" src="/wp-content/uploads/2018/06/word-image-901.png" srcset="/wp-content/uploads/2018/06/word-image-901.png 1142w, /wp-content/uploads/2018/06/word-image-901-300x131.png 300w, /wp-content/uploads/2018/06/word-image-901-768x336.png 768w, /wp-content/uploads/2018/06/word-image-901-1024x447.png 1024w" sizes="(max-width: 1142px) 100vw, 1142px" /></p>
<h2>商品基本数据和面包屑导航的展示</h2>
<ol>
<li>在home-GoodsController-detail方法中取出对应的数据：</li>
</ol>
<p><img loading="lazy" decoding="async" width="992" height="504" class="wp-image-8326" src="/wp-content/uploads/2018/06/word-image-902.png" srcset="/wp-content/uploads/2018/06/word-image-902.png 992w, /wp-content/uploads/2018/06/word-image-902-300x152.png 300w, /wp-content/uploads/2018/06/word-image-902-768x390.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<ol>
<li>模板中遍历</li>
<li>面包屑导航</li>
</ol>
<p><img loading="lazy" decoding="async" width="1252" height="393" class="wp-image-8327" src="/wp-content/uploads/2018/06/word-image-903.png" srcset="/wp-content/uploads/2018/06/word-image-903.png 1252w, /wp-content/uploads/2018/06/word-image-903-300x94.png 300w, /wp-content/uploads/2018/06/word-image-903-768x241.png 768w, /wp-content/uploads/2018/06/word-image-903-1024x321.png 1024w" sizes="(max-width: 1252px) 100vw, 1252px" /></p>
<p>b、商品基本数据</p>
<p><img loading="lazy" decoding="async" width="1258" height="600" class="wp-image-8328" src="/wp-content/uploads/2018/06/word-image-904.png" srcset="/wp-content/uploads/2018/06/word-image-904.png 1258w, /wp-content/uploads/2018/06/word-image-904-300x143.png 300w, /wp-content/uploads/2018/06/word-image-904-768x366.png 768w, /wp-content/uploads/2018/06/word-image-904-1024x488.png 1024w" sizes="(max-width: 1258px) 100vw, 1258px" /> <img loading="lazy" decoding="async" width="1057" height="316" class="wp-image-8329" src="/wp-content/uploads/2018/06/word-image-905.png" srcset="/wp-content/uploads/2018/06/word-image-905.png 1057w, /wp-content/uploads/2018/06/word-image-905-300x90.png 300w, /wp-content/uploads/2018/06/word-image-905-768x230.png 768w, /wp-content/uploads/2018/06/word-image-905-1024x306.png 1024w" sizes="(max-width: 1057px) 100vw, 1057px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="976" height="248" class="wp-image-8330" src="/wp-content/uploads/2018/06/word-image-906.png" srcset="/wp-content/uploads/2018/06/word-image-906.png 976w, /wp-content/uploads/2018/06/word-image-906-300x76.png 300w, /wp-content/uploads/2018/06/word-image-906-768x195.png 768w" sizes="(max-width: 976px) 100vw, 976px" /></p>
<h2>实现商品详情页中的图片画廊的展示</h2>
<p>1、由于图片的路径存储数据库是以json格式存储的，取出来的时候，需要进行json_decode反编码，变成一个图片的数组格式，这样方便在模板中进行遍历。</p>
<p><img loading="lazy" decoding="async" width="1046" height="501" class="wp-image-8331" src="/wp-content/uploads/2018/06/word-image-907.png" srcset="/wp-content/uploads/2018/06/word-image-907.png 1046w, /wp-content/uploads/2018/06/word-image-907-300x144.png 300w, /wp-content/uploads/2018/06/word-image-907-768x368.png 768w, /wp-content/uploads/2018/06/word-image-907-1024x490.png 1024w" sizes="(max-width: 1046px) 100vw, 1046px" /></p>
<p>注：由于TP5上传文件是使用反斜杠\进行路径保存的，但是在画廊中加载不出来，我们需要把其替换成正斜杠/。</p>
<p>修改后台admin的goods模型文件：</p>
<p><img loading="lazy" decoding="async" width="1060" height="513" class="wp-image-8332" src="/wp-content/uploads/2018/06/word-image-908.png" srcset="/wp-content/uploads/2018/06/word-image-908.png 1060w, /wp-content/uploads/2018/06/word-image-908-300x145.png 300w, /wp-content/uploads/2018/06/word-image-908-768x372.png 768w, /wp-content/uploads/2018/06/word-image-908-1024x496.png 1024w" sizes="(max-width: 1060px) 100vw, 1060px" /></p>
<p>之前代码用反斜杠炸开改为用正斜杠炸开:</p>
<p><img loading="lazy" decoding="async" width="1010" height="641" class="wp-image-8333" src="/wp-content/uploads/2018/06/word-image-909.png" srcset="/wp-content/uploads/2018/06/word-image-909.png 1010w, /wp-content/uploads/2018/06/word-image-909-300x190.png 300w, /wp-content/uploads/2018/06/word-image-909-768x487.png 768w" sizes="(max-width: 1010px) 100vw, 1010px" /></p>
<p>在模板中找到对应图片预览区域进行遍历：</p>
<p><img loading="lazy" decoding="async" width="1233" height="367" class="wp-image-8334" src="/wp-content/uploads/2018/06/word-image-910.png" srcset="/wp-content/uploads/2018/06/word-image-910.png 1233w, /wp-content/uploads/2018/06/word-image-910-300x89.png 300w, /wp-content/uploads/2018/06/word-image-910-768x229.png 768w, /wp-content/uploads/2018/06/word-image-910-1024x305.png 1024w" sizes="(max-width: 1233px) 100vw, 1233px" /> <img loading="lazy" decoding="async" width="1248" height="644" class="wp-image-8335" src="/wp-content/uploads/2018/06/word-image-911.png" srcset="/wp-content/uploads/2018/06/word-image-911.png 1248w, /wp-content/uploads/2018/06/word-image-911-300x155.png 300w, /wp-content/uploads/2018/06/word-image-911-768x396.png 768w, /wp-content/uploads/2018/06/word-image-911-1024x528.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<p>效果如下：</p>
<p><img loading="lazy" decoding="async" width="660" height="462" class="wp-image-8336" src="/wp-content/uploads/2018/06/word-image-912.png" srcset="/wp-content/uploads/2018/06/word-image-912.png 660w, /wp-content/uploads/2018/06/word-image-912-300x210.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<p>有关字符串的替换函数：</p>
<p><img loading="lazy" decoding="async" width="826" height="283" class="wp-image-8337" src="/wp-content/uploads/2018/06/word-image-913.png" srcset="/wp-content/uploads/2018/06/word-image-913.png 826w, /wp-content/uploads/2018/06/word-image-913-300x103.png 300w, /wp-content/uploads/2018/06/word-image-913-768x263.png 768w" sizes="(max-width: 826px) 100vw, 826px" /></p>
<p>注意：字符串替换函数既可以替换字符串也可以替换数组中的每个元素</p>
<h2>4、实现商品详情页属性的展示</h2>
<h3>分析</h3>
<p>单选属性：</p>
<p><img loading="lazy" decoding="async" width="662" height="241" class="wp-image-8338" src="/wp-content/uploads/2018/06/word-image-914.png" srcset="/wp-content/uploads/2018/06/word-image-914.png 662w, /wp-content/uploads/2018/06/word-image-914-300x109.png 300w" sizes="(max-width: 662px) 100vw, 662px" /></p>
<p>注意一点：</p>
<p>因为单选属性的值可能有多个，所以我们可以把根据属性的attr_id进行分组，把相同属性的attr_id的值归为同一组，方便在模板中进行循环遍历。</p>
<p>唯一属性：</p>
<p><img loading="lazy" decoding="async" width="858" height="178" class="wp-image-8339" src="/wp-content/uploads/2018/06/word-image-915.png" srcset="/wp-content/uploads/2018/06/word-image-915.png 858w, /wp-content/uploads/2018/06/word-image-915-300x62.png 300w, /wp-content/uploads/2018/06/word-image-915-768x159.png 768w" sizes="(max-width: 858px) 100vw, 858px" /></p>
<p>唯一属性不需要分组，因为唯一属性的值只有一个。</p>
<p>通过sql语句取出当前商品的拥有的单选属性：</p>
<p>三张表的关系：</p>
<p><img loading="lazy" decoding="async" width="790" height="341" class="wp-image-8340" src="/wp-content/uploads/2018/06/word-image-916.png" srcset="/wp-content/uploads/2018/06/word-image-916.png 790w, /wp-content/uploads/2018/06/word-image-916-300x129.png 300w, /wp-content/uploads/2018/06/word-image-916-768x332.png 768w" sizes="(max-width: 790px) 100vw, 790px" /></p>
<h3>代码实现</h3>
<p>取出当前商品的单选属性和唯一属性数据，并且唯一属性通过属性attr_id进行分组，这样方便在模板中进行遍历循环。</p>
<p>原生sql写法找出某个商品的单选属性数据</p>
<p><img loading="lazy" decoding="async" width="853" height="345" class="wp-image-8341" src="/wp-content/uploads/2018/06/word-image-917.png" srcset="/wp-content/uploads/2018/06/word-image-917.png 853w, /wp-content/uploads/2018/06/word-image-917-300x121.png 300w, /wp-content/uploads/2018/06/word-image-917-768x311.png 768w" sizes="(max-width: 853px) 100vw, 853px" /></p>
<p>代码中实现：</p>
<p>a、Db::query($sql);</p>
<p>b、模型实现</p>
<p><img loading="lazy" decoding="async" width="1054" height="668" class="wp-image-8342" src="/wp-content/uploads/2018/06/word-image-918.png" srcset="/wp-content/uploads/2018/06/word-image-918.png 1054w, /wp-content/uploads/2018/06/word-image-918-300x190.png 300w, /wp-content/uploads/2018/06/word-image-918-768x487.png 768w, /wp-content/uploads/2018/06/word-image-918-1024x649.png 1024w" sizes="(max-width: 1054px) 100vw, 1054px" /></p>
<p>模板中遍历单选属性：</p>
<p><img loading="lazy" decoding="async" width="1279" height="501" class="wp-image-8343" src="/wp-content/uploads/2018/06/word-image-919.png" srcset="/wp-content/uploads/2018/06/word-image-919.png 1279w, /wp-content/uploads/2018/06/word-image-919-300x118.png 300w, /wp-content/uploads/2018/06/word-image-919-768x301.png 768w, /wp-content/uploads/2018/06/word-image-919-1024x401.png 1024w" sizes="(max-width: 1279px) 100vw, 1279px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="399" height="110" class="wp-image-8344" src="/wp-content/uploads/2018/06/word-image-920.png" srcset="/wp-content/uploads/2018/06/word-image-920.png 399w, /wp-content/uploads/2018/06/word-image-920-300x83.png 300w" sizes="(max-width: 399px) 100vw, 399px" /></p>
<p>模板中遍历唯一属性：</p>
<p><img loading="lazy" decoding="async" width="1280" height="424" class="wp-image-8345" src="/wp-content/uploads/2018/06/word-image-921.png" srcset="/wp-content/uploads/2018/06/word-image-921.png 1280w, /wp-content/uploads/2018/06/word-image-921-300x99.png 300w, /wp-content/uploads/2018/06/word-image-921-768x254.png 768w, /wp-content/uploads/2018/06/word-image-921-1024x339.png 1024w" sizes="(max-width: 1280px) 100vw, 1280px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="753" height="134" class="wp-image-8346" src="/wp-content/uploads/2018/06/word-image-922.png" srcset="/wp-content/uploads/2018/06/word-image-922.png 753w, /wp-content/uploads/2018/06/word-image-922-300x53.png 300w" sizes="(max-width: 753px) 100vw, 753px" /></p>
<h1>二、实现商品详情页的浏览历史</h1>
<h3>1、分析</h3>
<p><img loading="lazy" decoding="async" width="290" height="182" class="wp-image-8347" src="/wp-content/uploads/2018/06/word-image-923.png" /></p>
<p>基本思路：</p>
<p>①可以使用cookie技术来实现浏览商品历史的存储，cookie中存储商品的goods_id即可。</p>
<p>只所以只存储浏览商品的id，因为商品的价格后面可能随时会变化，且记录一般存储3-5个。</p>
<p>②最新访问的商品应该放置在浏览历史的第一个位置</p>
<p>③当浏览历史存储量到达最大值（如超过5），应把最早访问的商品id给移除。</p>
<p>④当访问相同商品的时候，只保留最后访问的商品，即数组需要删除重复的元素。</p>
<p>cookie怎么存储所访问商品的id: 我们把访问商品的id存进数组中，再把数组写入到cookie中，形式如：[1,4,6,2,8]。‘1,4,6,2,8’</p>
<p>需要利用到的几个数组函数</p>
<p>array_unshift ：在数组头部加入一个或多个元素</p>
<p>array_pop : 弹出数组的最后一个元素</p>
<p>array_unique：去除数组的重复元素，保留之前第一个。</p>
<p>有关cookie函数的相关操作：</p>
<p><img loading="lazy" decoding="async" width="462" height="180" class="wp-image-8348" src="/wp-content/uploads/2018/06/word-image-924.png" srcset="/wp-content/uploads/2018/06/word-image-924.png 462w, /wp-content/uploads/2018/06/word-image-924-300x117.png 300w" sizes="(max-width: 462px) 100vw, 462px" /></p>
<h3>代码实现</h3>
<ol>
<li>当用户访问商品的时候，这时候，就应该把商品的goods_id存储到cookie中去</li>
</ol>
<p><img loading="lazy" decoding="async" width="1222" height="674" class="wp-image-8349" src="/wp-content/uploads/2018/06/word-image-925.png" srcset="/wp-content/uploads/2018/06/word-image-925.png 1222w, /wp-content/uploads/2018/06/word-image-925-300x165.png 300w, /wp-content/uploads/2018/06/word-image-925-768x424.png 768w, /wp-content/uploads/2018/06/word-image-925-1024x565.png 1024w" sizes="(max-width: 1222px) 100vw, 1222px" /></p>
<p>把上面的方式采用模型的方式来做：结果不行：用原生sql的方式去解决。</p>
<p># order by( field(goods_id,’2,8,5&#8242;) ) 按照字段goods_id 在2,8,5出现的顺序进行排序。</p>
<p><img loading="lazy" decoding="async" width="928" height="316" class="wp-image-8350" src="/wp-content/uploads/2018/06/word-image-926.png" srcset="/wp-content/uploads/2018/06/word-image-926.png 928w, /wp-content/uploads/2018/06/word-image-926-300x102.png 300w, /wp-content/uploads/2018/06/word-image-926-768x262.png 768w" sizes="(max-width: 928px) 100vw, 928px" /></p>
<ol>
<li>在Good模型中定义一个浏览历史的方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1209" height="624" class="wp-image-8351" src="/wp-content/uploads/2018/06/word-image-927.png" srcset="/wp-content/uploads/2018/06/word-image-927.png 1209w, /wp-content/uploads/2018/06/word-image-927-300x155.png 300w, /wp-content/uploads/2018/06/word-image-927-768x396.png 768w, /wp-content/uploads/2018/06/word-image-927-1024x529.png 1024w" sizes="(max-width: 1209px) 100vw, 1209px" /></p>
<ol>
<li>详情模板detail.html中进行遍历</li>
</ol>
<p><img loading="lazy" decoding="async" width="1267" height="441" class="wp-image-8352" src="/wp-content/uploads/2018/06/word-image-928.png" srcset="/wp-content/uploads/2018/06/word-image-928.png 1267w, /wp-content/uploads/2018/06/word-image-928-300x104.png 300w, /wp-content/uploads/2018/06/word-image-928-768x267.png 768w, /wp-content/uploads/2018/06/word-image-928-1024x356.png 1024w" sizes="(max-width: 1267px) 100vw, 1267px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="309" height="369" class="wp-image-8353" src="/wp-content/uploads/2018/06/word-image-929.png" srcset="/wp-content/uploads/2018/06/word-image-929.png 309w, /wp-content/uploads/2018/06/word-image-929-251x300.png 251w" sizes="(max-width: 309px) 100vw, 309px" /></p>
<h1>三、商城购物车概述</h1>
<h2>1、生活中的购物车</h2>
<p><img loading="lazy" decoding="async" width="130" height="129" class="wp-image-8354" src="/wp-content/uploads/2018/06/word-image-930.png" /></p>
<ul>
<li>购物车就像我们平常逛商场一样，主要是存放临时购买的商品。</li>
<li>需要买的商品就加入购物车，不要的就在放入货架（移除购物车），当购物完成之后就推着购物车到收银台去结算付款（支付宝支付）。</li>
</ul>
<h2>2、电商购物车商品存在哪</h2>
<p>电商购物车商品存储常用的几种方案：</p>
<ul>
<li>cookie+mysql （京东商城）</li>
</ul>
<p>这里需分两种情况：判断用户是否登录</p>
<p>未登录：把用户加入购物车的商品存储到cookie中（也称离线购物车），这对于没有注册京东用户的，一定程度上可以提升用户的购物体验。</p>
<p>登录：当结算付款时，这时候提示用户登录，把离线购物车中的商品转存在在线购物车（购物数据表）中。</p>
<ul>
<li>mysql（淘宝）</li>
</ul>
<p>用户没登录是不允许加入购物车的。</p>
<p>而淘宝购物车的做法是没有登录是不允许加入购物车的！</p>
<p>我们以淘宝的方式来实现购物车，</p>
<h2>购物车存哪些数据，该怎么存</h2>
<p>把商品加入到购物车，需要用到三个参数。商品id、商品单选属性id、购买的数量。</p>
<p>由于不同的商品其属性也不一样，所以需要加属性具体区分是哪一个商品。</p>
<p>如iphone6s黑色和iphone6s银色</p>
<p>产品+属性 = 商品</p>
<p>这里我们采用数组的形式来存储购物车商品数据：存储方式如下：</p>
<p>键名：商品$goods_id使用减号（-）拼接商品的属性id,$goods_attr_ids</p>
<p>键值：商品的数量</p>
<p>array(</p>
<p>//键=&gt;值</p>
<p>“$goods_id-$goods_attr_ids” =&gt; $number,</p>
<p>“10-12,25” =&gt; 5 //商品的goods_id为10，商品属性id为12,25，购买数量为5</p>
<p>);</p>
<p>购物车表sh_cart结构如下：（也称在线购物车），把其中的user_id改为member_id.</p>
<p><img loading="lazy" decoding="async" width="756" height="161" class="wp-image-8355" src="/wp-content/uploads/2018/06/word-image-931.png" srcset="/wp-content/uploads/2018/06/word-image-931.png 756w, /wp-content/uploads/2018/06/word-image-931-300x64.png 300w" sizes="(max-width: 756px) 100vw, 756px" /></p>
<p>字段说明：</p>
<p>cart_id:主键</p>
<p>goods_id:商品的id,和商品表goods_id字段关联</p>
<p>goods_attr_ids:商品的单选属性id,和商品属性表的goods_attr_id字段关联</p>
<p>goods_number:商品的购买数量</p>
<p>member_id:和会员表的member_id关联</p>
<p>购物车表sh_cart和其他几个表之间的关系：</p>
<p><img loading="lazy" decoding="async" width="735" height="486" class="wp-image-8356" src="/wp-content/uploads/2018/06/word-image-932.png" srcset="/wp-content/uploads/2018/06/word-image-932.png 735w, /wp-content/uploads/2018/06/word-image-932-300x198.png 300w" sizes="(max-width: 735px) 100vw, 735px" /></p>
<h2>4、购物车类的实现</h2>
<p>一般对购物车的商品操作就是增加、减少购买数量，删除商品，清空购物车等操作。</p>
<p>对购物车的操作其实就是对数组的操作，我们可以把这个几个方法封装在一个购物车类中。</p>
<p>购物车类名：</p>
<p><img loading="lazy" decoding="async" width="262" height="28" class="wp-image-8357" src="/wp-content/uploads/2018/06/word-image-933.png" /></p>
<p>类中有以下几个方法：</p>
<ul>
<li>initCartData初始化购物车数据（即获取当前用户购物车中的数据，构造函数中调用）</li>
<li>addCart 添加商品购物车</li>
<li>clearCart清空购物车</li>
<li>getCart获取购物车所有商品</li>
<li>delCart删除购物车指定商品</li>
<li>changeCartNum修改购物车商品数量</li>
</ul>
<p>&#8230;..</p>
<h2>引入购物车类够商城项目中</h2>
<p>在应用目录的extend中,定义一个购物车类Cart,并定义其所在的命名空间：</p>
<p><img loading="lazy" decoding="async" width="417" height="261" class="wp-image-8358" src="/wp-content/uploads/2018/06/word-image-934.png" srcset="/wp-content/uploads/2018/06/word-image-934.png 417w, /wp-content/uploads/2018/06/word-image-934-300x188.png 300w" sizes="(max-width: 417px) 100vw, 417px" /></p>
<p>在控制器中的某个方法中实例化上面的购物车类：</p>
<p><img loading="lazy" decoding="async" width="725" height="241" class="wp-image-8359" src="/wp-content/uploads/2018/06/word-image-935.png" srcset="/wp-content/uploads/2018/06/word-image-935.png 725w, /wp-content/uploads/2018/06/word-image-935-300x100.png 300w" sizes="(max-width: 725px) 100vw, 725px" /></p>
<p>结果：</p>
<p><img loading="lazy" decoding="async" width="449" height="92" class="wp-image-8360" src="/wp-content/uploads/2018/06/word-image-936.png" srcset="/wp-content/uploads/2018/06/word-image-936.png 449w, /wp-content/uploads/2018/06/word-image-936-300x61.png 300w" sizes="(max-width: 449px) 100vw, 449px" /></p>
<p>给购物车类添加以下几个方法：</p>
<ul>
<li>initCartData初始化购物车数据（即获取当前用户购物车中的所有数据，构造函数中调用）</li>
<li>addCart 添加商品购物车</li>
<li>clearCart清空购物车</li>
<li>getCart获取购物车所有商品</li>
<li>delCart删除购物车指定商品</li>
<li>changeCartNum修改购物车商品数量</li>
</ul>
<p><img loading="lazy" decoding="async" width="1091" height="581" class="wp-image-8361" src="/wp-content/uploads/2018/06/word-image-937.png" srcset="/wp-content/uploads/2018/06/word-image-937.png 1091w, /wp-content/uploads/2018/06/word-image-937-300x160.png 300w, /wp-content/uploads/2018/06/word-image-937-768x409.png 768w, /wp-content/uploads/2018/06/word-image-937-1024x545.png 1024w" sizes="(max-width: 1091px) 100vw, 1091px" /> <img loading="lazy" decoding="async" width="976" height="488" class="wp-image-8362" src="/wp-content/uploads/2018/06/word-image-938.png" srcset="/wp-content/uploads/2018/06/word-image-938.png 976w, /wp-content/uploads/2018/06/word-image-938-300x150.png 300w, /wp-content/uploads/2018/06/word-image-938-768x384.png 768w" sizes="(max-width: 976px) 100vw, 976px" /></p>
<p>上面几个方法定义好之后，最好测试一下是否可行，可向购物车表sh_cart中模拟一些假数据。</p>
<p><img loading="lazy" decoding="async" width="824" height="308" class="wp-image-8363" src="/wp-content/uploads/2018/06/word-image-939.png" srcset="/wp-content/uploads/2018/06/word-image-939.png 824w, /wp-content/uploads/2018/06/word-image-939-300x112.png 300w, /wp-content/uploads/2018/06/word-image-939-768x287.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></p>
<h1>四、ajax添加商品到购物车的实现</h1>
<h2>加入购物车分析</h2>
<p><img loading="lazy" decoding="async" width="885" height="469" class="wp-image-8364" src="/wp-content/uploads/2018/06/word-image-940.png" srcset="/wp-content/uploads/2018/06/word-image-940.png 885w, /wp-content/uploads/2018/06/word-image-940-300x159.png 300w, /wp-content/uploads/2018/06/word-image-940-768x407.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p>加入到购物车的商品需要以下几个三个字段：</p>
<p>商品id、商品单选属性id、商品数量</p>
<p>加入购物车的基本流程如下：</p>
<p><img loading="lazy" decoding="async" width="1114" height="394" class="wp-image-8365" src="/wp-content/uploads/2018/06/word-image-941.png" srcset="/wp-content/uploads/2018/06/word-image-941.png 1114w, /wp-content/uploads/2018/06/word-image-941-300x106.png 300w, /wp-content/uploads/2018/06/word-image-941-768x272.png 768w, /wp-content/uploads/2018/06/word-image-941-1024x362.png 1024w" sizes="(max-width: 1114px) 100vw, 1114px" /></p>
<h2>2、代码</h2>
<p>代码如下：</p>
<p>1、给商品详情页中的添加购物车的按钮，绑定一个单击事件，并阻止默认行为，获取商品的goods_id，数量goods_number,选择的单选属性goods_attr_ids.</p>
<p><img loading="lazy" decoding="async" width="1305" height="704" class="wp-image-8366" src="/wp-content/uploads/2018/06/word-image-942.png" srcset="/wp-content/uploads/2018/06/word-image-942.png 1305w, /wp-content/uploads/2018/06/word-image-942-300x162.png 300w, /wp-content/uploads/2018/06/word-image-942-768x414.png 768w, /wp-content/uploads/2018/06/word-image-942-1024x552.png 1024w" sizes="(max-width: 1305px) 100vw, 1305px" /></p>
<p>获取到三个参数：</p>
<p><img loading="lazy" decoding="async" width="946" height="521" class="wp-image-8367" src="/wp-content/uploads/2018/06/word-image-943.png" srcset="/wp-content/uploads/2018/06/word-image-943.png 946w, /wp-content/uploads/2018/06/word-image-943-300x165.png 300w, /wp-content/uploads/2018/06/word-image-943-768x423.png 768w" sizes="(max-width: 946px) 100vw, 946px" /></p>
<ol>
<li>发送ajax请求，把商品添加到购物车</li>
</ol>
<p><img loading="lazy" decoding="async" width="1028" height="432" class="wp-image-8368" src="/wp-content/uploads/2018/06/word-image-944.png" srcset="/wp-content/uploads/2018/06/word-image-944.png 1028w, /wp-content/uploads/2018/06/word-image-944-300x126.png 300w, /wp-content/uploads/2018/06/word-image-944-768x323.png 768w, /wp-content/uploads/2018/06/word-image-944-1024x430.png 1024w" sizes="(max-width: 1028px) 100vw, 1028px" /></p>
<ol>
<li>在home模块CartController控制器中建立一个ajaxAddCart的方法，实现商品添加到购物车</li>
</ol>
<p><img loading="lazy" decoding="async" width="980" height="506" class="wp-image-8369" src="/wp-content/uploads/2018/06/word-image-945.png" srcset="/wp-content/uploads/2018/06/word-image-945.png 980w, /wp-content/uploads/2018/06/word-image-945-300x155.png 300w, /wp-content/uploads/2018/06/word-image-945-768x397.png 768w" sizes="(max-width: 980px) 100vw, 980px" /></p>
<p>同时完善购物车方法addCart:</p>
<p><img loading="lazy" decoding="async" width="1084" height="684" class="wp-image-8370" src="/wp-content/uploads/2018/06/word-image-946.png" srcset="/wp-content/uploads/2018/06/word-image-946.png 1084w, /wp-content/uploads/2018/06/word-image-946-300x189.png 300w, /wp-content/uploads/2018/06/word-image-946-768x485.png 768w, /wp-content/uploads/2018/06/word-image-946-1024x646.png 1024w" sizes="(max-width: 1084px) 100vw, 1084px" /></p>
<p>模型的新方法：</p>
<p>setInc(字段名,[,数量]) :设置某个字段递增。数量不写默认自增1</p>
<p>setDec(字段名,[,数量]) ：设置某个字段递减。数量不写默认递减1</p>
<ol>
<li>根据ajax返回的json值，给用户对应提示</li>
</ol>
<p><img loading="lazy" decoding="async" width="1265" height="649" class="wp-image-8371" src="/wp-content/uploads/2018/06/word-image-947.png" srcset="/wp-content/uploads/2018/06/word-image-947.png 1265w, /wp-content/uploads/2018/06/word-image-947-300x154.png 300w, /wp-content/uploads/2018/06/word-image-947-768x394.png 768w, /wp-content/uploads/2018/06/word-image-947-1024x525.png 1024w" sizes="(max-width: 1265px) 100vw, 1265px" /></p>
<p>上面代码需要引入layer弹出层插件。</p>
<p>注：其中状态码code不等于200的时候，跳转地址后面加了一个参数return_url，记录当前访问商品的goods_id,当用户加入商品到购物车，提示用户未登录时候，用户再次登录成功，可以返回到之前的购物商品页面，这可提升用户的购物体验。</p>
<p>在登录方法login中，判断用户是否携带参数return_url，携带则跳转到之前访问的商品页。</p>
<p><img loading="lazy" decoding="async" width="1156" height="485" class="wp-image-8372" src="/wp-content/uploads/2018/06/word-image-948.png" srcset="/wp-content/uploads/2018/06/word-image-948.png 1156w, /wp-content/uploads/2018/06/word-image-948-300x126.png 300w, /wp-content/uploads/2018/06/word-image-948-768x322.png 768w, /wp-content/uploads/2018/06/word-image-948-1024x430.png 1024w" sizes="(max-width: 1156px) 100vw, 1156px" /></p>
<p>效果如下：</p>
<p><img loading="lazy" decoding="async" width="726" height="366" class="wp-image-8373" src="/wp-content/uploads/2018/06/word-image-949.png" srcset="/wp-content/uploads/2018/06/word-image-949.png 726w, /wp-content/uploads/2018/06/word-image-949-300x151.png 300w" sizes="(max-width: 726px) 100vw, 726px" /></p>
<h1>五、完成购物车商品列表展示</h1>
<h2>1、分析</h2>
<h2>2、代码</h2>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8321.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP5商城（八）购物车商品列表展示、Ajax删除、清空、更新购物车商品、展示订单结算页面、订单详情页商品展示</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8378.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8378.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 08 Jun 2018 00:33:49 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Ajax删除]]></category>
		<category><![CDATA[展示订单结算页面]]></category>
		<category><![CDATA[更新购物车商品]]></category>
		<category><![CDATA[清空]]></category>
		<category><![CDATA[订单详情页商品展示]]></category>
		<category><![CDATA[购物车商品列表展示]]></category>
		<guid isPermaLink="false">/?p=8378</guid>

					<description><![CDATA[商城第八天 联表的三步： 需要关联表的表 表关联的字段 通过where筛选条件进行过滤 原生的sql语句： s [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>商城第八天</h1>
<h1>联表的三步：</h1>
<ol>
<li>需要关联表的表</li>
<li>表关联的字段</li>
<li>通过where筛选条件进行过滤</li>
</ol>
<p>原生的sql语句： select * from table_name join 、where、group、having、order、limit</p>
<h1>一、购物车商品列表展示</h1>
<h2>1、分析</h2>
<p><img loading="lazy" decoding="async" width="1109" height="474" class="wp-image-8507" src="/wp-content/uploads/2018/06/word-image-1078.png" srcset="/wp-content/uploads/2018/06/word-image-1078.png 1109w, /wp-content/uploads/2018/06/word-image-1078-300x128.png 300w, /wp-content/uploads/2018/06/word-image-1078-768x328.png 768w, /wp-content/uploads/2018/06/word-image-1078-1024x438.png 1024w" sizes="(max-width: 1109px) 100vw, 1109px" /></p>
<p>上面的购物车数据从哪里来？</p>
<ol>
<li>先是从购物车表sh_cart</li>
</ol>
<p><img loading="lazy" decoding="async" width="512" height="67" class="wp-image-8508" src="/wp-content/uploads/2018/06/word-image-1079.png" srcset="/wp-content/uploads/2018/06/word-image-1079.png 512w, /wp-content/uploads/2018/06/word-image-1079-300x39.png 300w" sizes="(max-width: 512px) 100vw, 512px" /></p>
<p>通过上面一张表的数据，购物车数据是获取不到的，需要查询另外三张表:商品表、属性表、商品属性表</p>
<p><img loading="lazy" decoding="async" width="1094" height="139" class="wp-image-8509" src="/wp-content/uploads/2018/06/word-image-1080.png" srcset="/wp-content/uploads/2018/06/word-image-1080.png 1094w, /wp-content/uploads/2018/06/word-image-1080-300x38.png 300w, /wp-content/uploads/2018/06/word-image-1080-768x98.png 768w, /wp-content/uploads/2018/06/word-image-1080-1024x130.png 1024w" sizes="(max-width: 1094px) 100vw, 1094px" /></p>
<p>499元：（商品的单价（goods_price）+所有单选属性价格总和）* goods_number</p>
<h2>2、代码</h2>
<p>1、在home-CartController-cartList，展示购物车模板页面</p>
<p><img loading="lazy" decoding="async" width="689" height="242" class="wp-image-8510" src="/wp-content/uploads/2018/06/word-image-1081.png" srcset="/wp-content/uploads/2018/06/word-image-1081.png 689w, /wp-content/uploads/2018/06/word-image-1081-300x105.png 300w" sizes="(max-width: 689px) 100vw, 689px" /></p>
<p>模板如下：</p>
<p><img loading="lazy" decoding="async" width="795" height="372" class="wp-image-8511" src="/wp-content/uploads/2018/06/word-image-1082.png" srcset="/wp-content/uploads/2018/06/word-image-1082.png 795w, /wp-content/uploads/2018/06/word-image-1082-300x140.png 300w, /wp-content/uploads/2018/06/word-image-1082-768x359.png 768w" sizes="(max-width: 795px) 100vw, 795px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="988" height="250" class="wp-image-8512" src="/wp-content/uploads/2018/06/word-image-1083.png" srcset="/wp-content/uploads/2018/06/word-image-1083.png 988w, /wp-content/uploads/2018/06/word-image-1083-300x76.png 300w, /wp-content/uploads/2018/06/word-image-1083-768x194.png 768w" sizes="(max-width: 988px) 100vw, 988px" /></p>
<ol>
<li>把购物车数据取出来，组装成如下的数据结构，方便后面查询</li>
</ol>
<p>[</p>
<p>[</p>
<p>goods_id =&gt; 1</p>
<p>goods_attr_ids =&gt; 1,5</p>
<p>goods_number =&gt; 10</p>
<p>]</p>
<p>&#8230;&#8230;</p>
<p>]</p>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="1055" height="420" class="wp-image-8513" src="/wp-content/uploads/2018/06/word-image-1084.png" srcset="/wp-content/uploads/2018/06/word-image-1084.png 1055w, /wp-content/uploads/2018/06/word-image-1084-300x119.png 300w, /wp-content/uploads/2018/06/word-image-1084-768x306.png 768w, /wp-content/uploads/2018/06/word-image-1084-1024x408.png 1024w" sizes="(max-width: 1055px) 100vw, 1055px" /></p>
<ol>
<li>在把上面的组装好的数组cartData变量，给其每个数组元素加下标goodsInfo和attrInfo，分别存储商品信息和商品属性信息。</li>
</ol>
<p>类似结构如下：</p>
<p>[</p>
<p>[</p>
<p>goods_id =&gt; 1</p>
<p>goods_attr_ids =&gt; 1,5</p>
<p>goods_number =&gt; 10，</p>
<p>goodsInfo =&gt; [goods_name,goods_price,goods_img,&#8230;&#8230;]</p>
<p>attrInfo =&gt;[attr_name,attr_value,attr_price,&#8230;&#8230;]</p>
<p>]</p>
<p>&#8230;&#8230;</p>
<p>]</p>
<p>代码如下：</p>
<p><img loading="lazy" decoding="async" width="1272" height="534" class="wp-image-8514" src="/wp-content/uploads/2018/06/word-image-1085.png" srcset="/wp-content/uploads/2018/06/word-image-1085.png 1272w, /wp-content/uploads/2018/06/word-image-1085-300x126.png 300w, /wp-content/uploads/2018/06/word-image-1085-768x322.png 768w, /wp-content/uploads/2018/06/word-image-1085-1024x430.png 1024w" sizes="(max-width: 1272px) 100vw, 1272px" /></p>
<p>最终组装好的$cartData数组结构如下：</p>
<p><img loading="lazy" decoding="async" width="656" height="536" class="wp-image-8515" src="/wp-content/uploads/2018/06/word-image-1086.png" srcset="/wp-content/uploads/2018/06/word-image-1086.png 656w, /wp-content/uploads/2018/06/word-image-1086-300x245.png 300w" sizes="(max-width: 656px) 100vw, 656px" /></p>
<ol>
<li>在cartList.html模板文件中，进行遍历购物车相关数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1227" height="647" class="wp-image-8516" src="/wp-content/uploads/2018/06/word-image-1087.png" srcset="/wp-content/uploads/2018/06/word-image-1087.png 1227w, /wp-content/uploads/2018/06/word-image-1087-300x158.png 300w, /wp-content/uploads/2018/06/word-image-1087-768x405.png 768w, /wp-content/uploads/2018/06/word-image-1087-1024x540.png 1024w" sizes="(max-width: 1227px) 100vw, 1227px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="1117" height="392" class="wp-image-8517" src="/wp-content/uploads/2018/06/word-image-1088.png" srcset="/wp-content/uploads/2018/06/word-image-1088.png 1117w, /wp-content/uploads/2018/06/word-image-1088-300x105.png 300w, /wp-content/uploads/2018/06/word-image-1088-768x270.png 768w, /wp-content/uploads/2018/06/word-image-1088-1024x359.png 1024w" sizes="(max-width: 1117px) 100vw, 1117px" /></p>
<h1>ajax删除购物车商品</h1>
<p><img loading="lazy" decoding="async" width="1060" height="197" class="wp-image-8518" src="/wp-content/uploads/2018/06/word-image-1089.png" srcset="/wp-content/uploads/2018/06/word-image-1089.png 1060w, /wp-content/uploads/2018/06/word-image-1089-300x56.png 300w, /wp-content/uploads/2018/06/word-image-1089-768x143.png 768w, /wp-content/uploads/2018/06/word-image-1089-1024x190.png 1024w" sizes="(max-width: 1060px) 100vw, 1060px" /></p>
<ol>
<li>给删除链接地址绑定单击事件，并阻止默认行为，还要获取商品goods_id和商品属性goods_attr_ids。</li>
</ol>
<p><img loading="lazy" decoding="async" width="1183" height="319" class="wp-image-8519" src="/wp-content/uploads/2018/06/word-image-1090.png" srcset="/wp-content/uploads/2018/06/word-image-1090.png 1183w, /wp-content/uploads/2018/06/word-image-1090-300x81.png 300w, /wp-content/uploads/2018/06/word-image-1090-768x207.png 768w, /wp-content/uploads/2018/06/word-image-1090-1024x276.png 1024w" sizes="(max-width: 1183px) 100vw, 1183px" /></p>
<ol>
<li>给class=’delCartGoods’绑定单击事件</li>
</ol>
<p><img loading="lazy" decoding="async" width="1207" height="485" class="wp-image-8520" src="/wp-content/uploads/2018/06/word-image-1091.png" srcset="/wp-content/uploads/2018/06/word-image-1091.png 1207w, /wp-content/uploads/2018/06/word-image-1091-300x121.png 300w, /wp-content/uploads/2018/06/word-image-1091-768x309.png 768w, /wp-content/uploads/2018/06/word-image-1091-1024x411.png 1024w" sizes="(max-width: 1207px) 100vw, 1207px" /></p>
<p>注：要引入layer弹出层插件。</p>
<ol>
<li>在CartController控制器的ajaxDelGoods方法中，完成删除购物车商品</li>
</ol>
<p><img loading="lazy" decoding="async" width="1032" height="350" class="wp-image-8521" src="/wp-content/uploads/2018/06/word-image-1092.png" srcset="/wp-content/uploads/2018/06/word-image-1092.png 1032w, /wp-content/uploads/2018/06/word-image-1092-300x102.png 300w, /wp-content/uploads/2018/06/word-image-1092-768x260.png 768w, /wp-content/uploads/2018/06/word-image-1092-1024x347.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<p>同时完善删除购物车商品的方法:</p>
<p><img loading="lazy" decoding="async" width="862" height="366" class="wp-image-8522" src="/wp-content/uploads/2018/06/word-image-1093.png" srcset="/wp-content/uploads/2018/06/word-image-1093.png 862w, /wp-content/uploads/2018/06/word-image-1093-300x127.png 300w, /wp-content/uploads/2018/06/word-image-1093-768x326.png 768w" sizes="(max-width: 862px) 100vw, 862px" /></p>
<h1>ajax清空购物车商品</h1>
<ol>
<li>在购物车页面加一个清空购物车的功能链接</li>
</ol>
<p><img loading="lazy" decoding="async" width="1252" height="393" class="wp-image-8523" src="/wp-content/uploads/2018/06/word-image-1094.png" srcset="/wp-content/uploads/2018/06/word-image-1094.png 1252w, /wp-content/uploads/2018/06/word-image-1094-300x94.png 300w, /wp-content/uploads/2018/06/word-image-1094-768x241.png 768w, /wp-content/uploads/2018/06/word-image-1094-1024x321.png 1024w" sizes="(max-width: 1252px) 100vw, 1252px" /></p>
<ol>
<li>给上面的按钮绑定单击事件</li>
</ol>
<p><img loading="lazy" decoding="async" width="1240" height="478" class="wp-image-8524" src="/wp-content/uploads/2018/06/word-image-1095.png" srcset="/wp-content/uploads/2018/06/word-image-1095.png 1240w, /wp-content/uploads/2018/06/word-image-1095-300x116.png 300w, /wp-content/uploads/2018/06/word-image-1095-768x296.png 768w, /wp-content/uploads/2018/06/word-image-1095-1024x395.png 1024w" sizes="(max-width: 1240px) 100vw, 1240px" /></p>
<ol>
<li>在CartController控制器的cartCart方法中调用购物车对象，清空购物车</li>
</ol>
<p><img loading="lazy" decoding="async" width="951" height="293" class="wp-image-8525" src="/wp-content/uploads/2018/06/word-image-1096.png" srcset="/wp-content/uploads/2018/06/word-image-1096.png 951w, /wp-content/uploads/2018/06/word-image-1096-300x92.png 300w, /wp-content/uploads/2018/06/word-image-1096-768x237.png 768w" sizes="(max-width: 951px) 100vw, 951px" /></p>
<p>注：上面的方法名字取得不合理，建议改为clearCart</p>
<ol>
<li>在购物车类中定义清空购物车的方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="962" height="383" class="wp-image-8526" src="/wp-content/uploads/2018/06/word-image-1097.png" srcset="/wp-content/uploads/2018/06/word-image-1097.png 962w, /wp-content/uploads/2018/06/word-image-1097-300x119.png 300w, /wp-content/uploads/2018/06/word-image-1097-768x306.png 768w" sizes="(max-width: 962px) 100vw, 962px" /></p>
<h1>四、ajax更新购物车商品数量</h1>
<p><img loading="lazy" decoding="async" width="1122" height="168" class="wp-image-8527" src="/wp-content/uploads/2018/06/word-image-1098.png" srcset="/wp-content/uploads/2018/06/word-image-1098.png 1122w, /wp-content/uploads/2018/06/word-image-1098-300x45.png 300w, /wp-content/uploads/2018/06/word-image-1098-768x115.png 768w, /wp-content/uploads/2018/06/word-image-1098-1024x153.png 1024w" sizes="(max-width: 1122px) 100vw, 1122px" /></p>
<p>说明：当我们点击+-号的时候，价格已经自动给我们算好了，但是未更新到数据库。</p>
<p>这其实一个另外一个js文件做好了cart1.js:</p>
<p><img loading="lazy" decoding="async" width="736" height="377" class="wp-image-8528" src="/wp-content/uploads/2018/06/word-image-1099.png" srcset="/wp-content/uploads/2018/06/word-image-1099.png 736w, /wp-content/uploads/2018/06/word-image-1099-300x154.png 300w" sizes="(max-width: 736px) 100vw, 736px" /></p>
<h2>ajax加更新数量</h2>
<ol>
<li>给当前+符号（class=add_num）的父元素，设置两个属性，记录商品的id和商品的属性id</li>
</ol>
<p><img loading="lazy" decoding="async" width="1270" height="337" class="wp-image-8529" src="/wp-content/uploads/2018/06/word-image-1100.png" srcset="/wp-content/uploads/2018/06/word-image-1100.png 1270w, /wp-content/uploads/2018/06/word-image-1100-300x80.png 300w, /wp-content/uploads/2018/06/word-image-1100-768x204.png 768w, /wp-content/uploads/2018/06/word-image-1100-1024x272.png 1024w" sizes="(max-width: 1270px) 100vw, 1270px" /></p>
<p>2、需要修改增加数量的业务逻辑</p>
<p><img loading="lazy" decoding="async" width="681" height="387" class="wp-image-8530" src="/wp-content/uploads/2018/06/word-image-1101.png" srcset="/wp-content/uploads/2018/06/word-image-1101.png 681w, /wp-content/uploads/2018/06/word-image-1101-300x170.png 300w" sizes="(max-width: 681px) 100vw, 681px" /> <img loading="lazy" decoding="async" width="1056" height="717" class="wp-image-8531" src="/wp-content/uploads/2018/06/word-image-1102.png" srcset="/wp-content/uploads/2018/06/word-image-1102.png 1056w, /wp-content/uploads/2018/06/word-image-1102-300x204.png 300w, /wp-content/uploads/2018/06/word-image-1102-768x521.png 768w, /wp-content/uploads/2018/06/word-image-1102-1024x695.png 1024w" sizes="(max-width: 1056px) 100vw, 1056px" /></p>
<ol>
<li>在CartController控制器建立一个changeCartNum的方法，调用购物车对象更新数量</li>
</ol>
<p><img loading="lazy" decoding="async" width="979" height="452" class="wp-image-8532" src="/wp-content/uploads/2018/06/word-image-1103.png" srcset="/wp-content/uploads/2018/06/word-image-1103.png 979w, /wp-content/uploads/2018/06/word-image-1103-300x139.png 300w, /wp-content/uploads/2018/06/word-image-1103-768x355.png 768w" sizes="(max-width: 979px) 100vw, 979px" /></p>
<ol>
<li>在购物车类中完善更新商品的数量方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1107" height="364" class="wp-image-8533" src="/wp-content/uploads/2018/06/word-image-1104.png" srcset="/wp-content/uploads/2018/06/word-image-1104.png 1107w, /wp-content/uploads/2018/06/word-image-1104-300x99.png 300w, /wp-content/uploads/2018/06/word-image-1104-768x253.png 768w, /wp-content/uploads/2018/06/word-image-1104-1024x337.png 1024w" sizes="(max-width: 1107px) 100vw, 1107px" /></p>
<p>setField(字段名，值)： 把字段名设置为指定的值</p>
<p><img loading="lazy" decoding="async" width="547" height="44" class="wp-image-8534" src="/wp-content/uploads/2018/06/word-image-1105.png" srcset="/wp-content/uploads/2018/06/word-image-1105.png 547w, /wp-content/uploads/2018/06/word-image-1105-300x24.png 300w" sizes="(max-width: 547px) 100vw, 547px" /></p>
<h2>ajax减更新数量</h2>
<p>只需修改cart1.js文件，发送ajax进行更新</p>
<p><img loading="lazy" decoding="async" width="1081" height="682" class="wp-image-8535" src="/wp-content/uploads/2018/06/word-image-1106.png" srcset="/wp-content/uploads/2018/06/word-image-1106.png 1081w, /wp-content/uploads/2018/06/word-image-1106-300x189.png 300w, /wp-content/uploads/2018/06/word-image-1106-768x485.png 768w, /wp-content/uploads/2018/06/word-image-1106-1024x646.png 1024w" sizes="(max-width: 1081px) 100vw, 1081px" /></p>
<h2>ajax失焦更新数量</h2>
<h3>（1）bug修复</h3>
<p>当用户在输入框输入的数量不是纯数字的，失去焦点的时候，数量应该恢复之前的值。</p>
<p>为了可以恢复之前数量，我们可以在输入框获得焦点的时候，设置一个自定义属性记录之前的数量。</p>
<p><img loading="lazy" decoding="async" width="632" height="368" class="wp-image-8536" src="/wp-content/uploads/2018/06/word-image-1107.png" srcset="/wp-content/uploads/2018/06/word-image-1107.png 632w, /wp-content/uploads/2018/06/word-image-1107-300x175.png 300w" sizes="(max-width: 632px) 100vw, 632px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="678" height="87" class="wp-image-8537" src="/wp-content/uploads/2018/06/word-image-1108.png" srcset="/wp-content/uploads/2018/06/word-image-1108.png 678w, /wp-content/uploads/2018/06/word-image-1108-300x38.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<h3>（3）代码</h3>
<p>也只需修改cart1.js文件即可：</p>
<p><img loading="lazy" decoding="async" width="494" height="228" class="wp-image-8538" src="/wp-content/uploads/2018/06/word-image-1109.png" srcset="/wp-content/uploads/2018/06/word-image-1109.png 494w, /wp-content/uploads/2018/06/word-image-1109-300x138.png 300w" sizes="(max-width: 494px) 100vw, 494px" /></p>
<p>代码：</p>
<p><img loading="lazy" decoding="async" width="802" height="483" class="wp-image-8539" src="/wp-content/uploads/2018/06/word-image-1110.png" srcset="/wp-content/uploads/2018/06/word-image-1110.png 802w, /wp-content/uploads/2018/06/word-image-1110-300x180.png 300w, /wp-content/uploads/2018/06/word-image-1110-768x463.png 768w" sizes="(max-width: 802px) 100vw, 802px" /> <img loading="lazy" decoding="async" width="1070" height="323" class="wp-image-8540" src="/wp-content/uploads/2018/06/word-image-1111.png" srcset="/wp-content/uploads/2018/06/word-image-1111.png 1070w, /wp-content/uploads/2018/06/word-image-1111-300x91.png 300w, /wp-content/uploads/2018/06/word-image-1111-768x232.png 768w, /wp-content/uploads/2018/06/word-image-1111-1024x309.png 1024w" sizes="(max-width: 1070px) 100vw, 1070px" /></p>
<h2>代码优化部分</h2>
<p>由于增加、减少、失焦，都要触发ajax请求，更新商品的购买数量，我们把发送ajax的逻辑封装在一个函数中，同时设置一个回调函数callback处理对应业务逻辑;</p>
<p><img loading="lazy" decoding="async" width="1204" height="367" class="wp-image-8541" src="/wp-content/uploads/2018/06/word-image-1112.png" srcset="/wp-content/uploads/2018/06/word-image-1112.png 1204w, /wp-content/uploads/2018/06/word-image-1112-300x91.png 300w, /wp-content/uploads/2018/06/word-image-1112-768x234.png 768w, /wp-content/uploads/2018/06/word-image-1112-1024x312.png 1024w" sizes="(max-width: 1204px) 100vw, 1204px" /></p>
<p>如增加数量调用上面的方法：</p>
<p><img loading="lazy" decoding="async" width="1258" height="690" class="wp-image-8542" src="/wp-content/uploads/2018/06/word-image-1113.png" srcset="/wp-content/uploads/2018/06/word-image-1113.png 1258w, /wp-content/uploads/2018/06/word-image-1113-300x165.png 300w, /wp-content/uploads/2018/06/word-image-1113-768x421.png 768w, /wp-content/uploads/2018/06/word-image-1113-1024x562.png 1024w" sizes="(max-width: 1258px) 100vw, 1258px" /></p>
<h1>展示订单结算页面</h1>
<h2>1、输出订单详情页模板</h2>
<p>当在购物车点击结算按钮，跳转到页面订单详情页，主要输入用户的收货地址，还有确认购买的订单商品。</p>
<p><img loading="lazy" decoding="async" width="1114" height="351" class="wp-image-8543" src="/wp-content/uploads/2018/06/word-image-1114.png" srcset="/wp-content/uploads/2018/06/word-image-1114.png 1114w, /wp-content/uploads/2018/06/word-image-1114-300x95.png 300w, /wp-content/uploads/2018/06/word-image-1114-768x242.png 768w, /wp-content/uploads/2018/06/word-image-1114-1024x323.png 1024w" sizes="(max-width: 1114px) 100vw, 1114px" /></p>
<p>1、修改上面结算按钮的链接地址</p>
<p><img loading="lazy" decoding="async" width="1108" height="186" class="wp-image-8544" src="/wp-content/uploads/2018/06/word-image-1115.png" srcset="/wp-content/uploads/2018/06/word-image-1115.png 1108w, /wp-content/uploads/2018/06/word-image-1115-300x50.png 300w, /wp-content/uploads/2018/06/word-image-1115-768x129.png 768w, /wp-content/uploads/2018/06/word-image-1115-1024x172.png 1024w" sizes="(max-width: 1108px) 100vw, 1108px" /></p>
<ol>
<li>在home模块的OrderController的控制器的orderInfo的方法，输出订单信息的页面。</li>
</ol>
<p><img loading="lazy" decoding="async" width="816" height="366" class="wp-image-8545" src="/wp-content/uploads/2018/06/word-image-1116.png" srcset="/wp-content/uploads/2018/06/word-image-1116.png 816w, /wp-content/uploads/2018/06/word-image-1116-300x135.png 300w, /wp-content/uploads/2018/06/word-image-1116-768x344.png 768w" sizes="(max-width: 816px) 100vw, 816px" /></p>
<ol>
<li>把课件中的flow22.html调整好的模板复制到home/view/order/目录下面。并改名为orderinfo.html</li>
</ol>
<p><img loading="lazy" decoding="async" width="1054" height="216" class="wp-image-8546" src="/wp-content/uploads/2018/06/word-image-1117.png" srcset="/wp-content/uploads/2018/06/word-image-1117.png 1054w, /wp-content/uploads/2018/06/word-image-1117-300x61.png 300w, /wp-content/uploads/2018/06/word-image-1117-768x157.png 768w, /wp-content/uploads/2018/06/word-image-1117-1024x210.png 1024w" sizes="(max-width: 1054px) 100vw, 1054px" /></p>
<p>最终效果如下：</p>
<p><img loading="lazy" decoding="async" width="1072" height="668" class="wp-image-8547" src="/wp-content/uploads/2018/06/word-image-1118.png" srcset="/wp-content/uploads/2018/06/word-image-1118.png 1072w, /wp-content/uploads/2018/06/word-image-1118-300x187.png 300w, /wp-content/uploads/2018/06/word-image-1118-768x479.png 768w, /wp-content/uploads/2018/06/word-image-1118-1024x638.png 1024w" sizes="(max-width: 1072px) 100vw, 1072px" /></p>
<h2>订单详情页商品显示</h2>
<ol>
<li>把之前获取购物车商品的信息封装在前台home的goods模型中的方法中</li>
</ol>
<p><img loading="lazy" decoding="async" width="1333" height="699" class="wp-image-8548" src="/wp-content/uploads/2018/06/word-image-1119.png" srcset="/wp-content/uploads/2018/06/word-image-1119.png 1333w, /wp-content/uploads/2018/06/word-image-1119-300x157.png 300w, /wp-content/uploads/2018/06/word-image-1119-768x403.png 768w, /wp-content/uploads/2018/06/word-image-1119-1024x537.png 1024w" sizes="(max-width: 1333px) 100vw, 1333px" /></p>
<p>注：需要在上面的Goods模型引入Db类。</p>
<ol>
<li>在orderInfo的方法中，调用上面的方法，获取购物车商品的数据，并分配到模板中</li>
</ol>
<p><img loading="lazy" decoding="async" width="885" height="331" class="wp-image-8549" src="/wp-content/uploads/2018/06/word-image-1120.png" srcset="/wp-content/uploads/2018/06/word-image-1120.png 885w, /wp-content/uploads/2018/06/word-image-1120-300x112.png 300w, /wp-content/uploads/2018/06/word-image-1120-768x287.png 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<ol>
<li>在orderinfo.html模板中进行遍历输出</li>
</ol>
<p><img loading="lazy" decoding="async" width="1220" height="621" class="wp-image-8550" src="/wp-content/uploads/2018/06/word-image-1121.png" srcset="/wp-content/uploads/2018/06/word-image-1121.png 1220w, /wp-content/uploads/2018/06/word-image-1121-300x153.png 300w, /wp-content/uploads/2018/06/word-image-1121-768x391.png 768w, /wp-content/uploads/2018/06/word-image-1121-1024x521.png 1024w" sizes="(max-width: 1220px) 100vw, 1220px" /></p>
<p>注：上面遍历的代码可以直接复制购物车列表模板cartlist.html的代码。续做修改就行。</p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="1085" height="535" class="wp-image-8551" src="/wp-content/uploads/2018/06/word-image-1122.png" srcset="/wp-content/uploads/2018/06/word-image-1122.png 1085w, /wp-content/uploads/2018/06/word-image-1122-300x148.png 300w, /wp-content/uploads/2018/06/word-image-1122-768x379.png 768w, /wp-content/uploads/2018/06/word-image-1122-1024x505.png 1024w" sizes="(max-width: 1085px) 100vw, 1085px" /></p>
<h1>六、完成订单数据入库</h1>
<h2>订单数据入库的顺序</h2>
<p>订单商品入库的顺序：</p>
<p>第一步：先把订单基本数据入库到订单表sh_order</p>
<p>第二步：订单表数据入库成功之后才能把订单商品入库到订单商品表中sh_order_goods中</p>
<p>如果保证上面两步执行过程中都没有问题呢，这里需要借助到mysql的事务，可以保持数据的一致性。当发生异常的时候，会自动回滚。</p>
<p>注意：只有表的引擎是innodb引擎才支持事务操作。</p>
<p>TP5中有关事务操作的相关方法：</p>
<p>启动事务：Db::startTrans()</p>
<p>提交事务：Db::commit()</p>
<p>事务回滚：Db::rollback()</p>
<p>手册示例：</p>
<p><img loading="lazy" decoding="async" width="422" height="252" class="wp-image-8552" src="/wp-content/uploads/2018/06/word-image-1123.png" srcset="/wp-content/uploads/2018/06/word-image-1123.png 422w, /wp-content/uploads/2018/06/word-image-1123-300x180.png 300w" sizes="(max-width: 422px) 100vw, 422px" /></p>
<h2>订单表和订单商品表的数据入库</h2>
<h1>七、支付技术介绍</h1>
<h2>1、早起网站支付</h2>
<p>早期的电商都是送货上门，邮政汇款，这样的话，商家会承担很大的风险。</p>
<p>后面的时候有部分网站和银行进行签约，使用网银、手机银行等。</p>
<p>再往后，就是支付宝、微信。</p>
<p>早期的公司如果想申请网银需要直接去找银行申请相关的支付接口，而且现在银行这么多公司不可能去每家银行申请支付接口，这样未免也太麻烦了。</p>
<p><img loading="lazy" decoding="async" width="493" height="189" class="wp-image-8553" src="/wp-content/uploads/2018/06/word-image-1124.png" srcset="/wp-content/uploads/2018/06/word-image-1124.png 493w, /wp-content/uploads/2018/06/word-image-1124-300x115.png 300w" sizes="(max-width: 493px) 100vw, 493px" /></p>
<p>如果有的网站的资金流动比较少的话，有的银行都不会和这些小公司进行合作，因为从中赚不到什么利润。所以就有了第三方支付平台（微信、支付宝、京东钱包、qq财付通、百度钱包）来解决这些问题。</p>
<p><img loading="lazy" decoding="async" width="625" height="173" class="wp-image-8554" src="/wp-content/uploads/2018/06/word-image-1125.png" srcset="/wp-content/uploads/2018/06/word-image-1125.png 625w, /wp-content/uploads/2018/06/word-image-1125-300x83.png 300w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<h2>2、现在的网站支付</h2>
<p>为了解决早期网站支付的问题，避免了商家繁琐的去每家银行获取支付接口。现在有些公司专门集合了所有银行的支付接口，这些公司进而在提供支付接口给我们企业或开发者使用，这些公司就是第三方支付平台。</p>
<p>常见的第三方支付平台：微信、支付宝、京东钱包、qq财付通、百度钱包等</p>
<p>有了这些第三方支付平台，我们企业或开发者就不需要独自跑去银行去申请支付接口了，直接利用第三方支付平台，在参考他们的支付接口文档即可完成我们的支付了！</p>
<h1>八、支付宝支付</h1>
<p>注意一点：现在的支付宝支付需要企业或个体工商户可申请才，个人是没法申请的。</p>
<p>企业或个体工商户申请的条件如下：</p>
<p>1. 提供真实有效的营业执照，且支付宝账户名称需与营业执照主体一致；</p>
<p>2. 网站能正常访问且页面信息有完整商品内容；</p>
<p>3. 网站必须通过ICP备案，个体户备案需与账户主体一致。</p>
<p>（团购类网站不支持个体工商户签约）</p>
<p>不过好处的个人开发者我们可以使用支付宝提供的沙箱环境进行模拟支付。</p>
<p>那么什么是沙箱环境？</p>
<p>答：就是支付宝提供给我们开发者一个虚拟的支付环境。其中的操作和真实支付环境是完全一样的。买家账号和卖家账号沙箱环境都给我们提供好了。</p>
<p>后面的沙箱环境支付，支付宝会提供一个商家账户和个人买家账户给我们，我们在配合支付接口文档即可完成支付。</p>
<h2>企业或个体工商户申请支付</h2>
<p>申请的网址：<a href="/goto/pv02" rel="nofollow">https://b.alipay.com/</a> （b: business企业）</p>
<p>点击下面的电脑网站支付的接入按钮：</p>
<p><img loading="lazy" decoding="async" width="1277" height="644" class="wp-image-8555" src="/wp-content/uploads/2018/06/word-image-1126.png" srcset="/wp-content/uploads/2018/06/word-image-1126.png 1277w, /wp-content/uploads/2018/06/word-image-1126-300x151.png 300w, /wp-content/uploads/2018/06/word-image-1126-768x387.png 768w, /wp-content/uploads/2018/06/word-image-1126-1024x516.png 1024w" sizes="(max-width: 1277px) 100vw, 1277px" /></p>
<p>这里支付宝提供了5种支付方式给我们使用，网站就要使用电脑网站支付。</p>
<p>早期支付宝只有两种支付方式：</p>
<p>即时到帐：我们上面看到的5个支付方式都是这个衍生出来的 ，一旦付款，立马到账。</p>
<p>担保支付： 7天担保，早期淘宝网，买家买东西的钱先到了淘宝的帐号呆够7天，商家才收到款，担保支付支付宝已经取消了。</p>
<p>企业或个体户点击上面电脑网站支付，需要以下申请条件：</p>
<p><img loading="lazy" decoding="async" width="739" height="367" class="wp-image-8556" src="/wp-content/uploads/2018/06/word-image-1127.png" srcset="/wp-content/uploads/2018/06/word-image-1127.png 739w, /wp-content/uploads/2018/06/word-image-1127-300x149.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></p>
<p>上面的申请条件，以后去企业上班，公司都会帮我们申请好的。</p>
<p>上面是企业或个体工商户申请的基本步骤，我们个人没法申请，所以这里我们只能使用沙箱环境进行支付测试。</p>
<h2>申请沙箱应用</h2>
<p>首页，登陆支付宝开放平台，进入到如下的开发者中心</p>
<p><a href="/goto/kris" rel="nofollow">https://openhome.alipay.com/platform/developerIndex.htm</a></p>
<p><img loading="lazy" decoding="async" width="825" height="208" class="wp-image-8557" src="/wp-content/uploads/2018/06/word-image-1128.png" srcset="/wp-content/uploads/2018/06/word-image-1128.png 825w, /wp-content/uploads/2018/06/word-image-1128-300x76.png 300w, /wp-content/uploads/2018/06/word-image-1128-768x194.png 768w" sizes="(max-width: 825px) 100vw, 825px" /></p>
<p>点击开发者中心-&gt;研发服务，进入如下的沙箱环境：</p>
<p>去创建沙箱应用,如下是已经创建的沙箱环境：</p>
<p><img loading="lazy" decoding="async" width="1088" height="623" class="wp-image-8558" src="/wp-content/uploads/2018/06/word-image-1129.png" srcset="/wp-content/uploads/2018/06/word-image-1129.png 1088w, /wp-content/uploads/2018/06/word-image-1129-300x172.png 300w, /wp-content/uploads/2018/06/word-image-1129-768x440.png 768w, /wp-content/uploads/2018/06/word-image-1129-1024x586.png 1024w" sizes="(max-width: 1088px) 100vw, 1088px" /></p>
<p>沙箱中的提供两个测试账户：商家账户 和 买家账户，其账户余额都是虚拟的</p>
<p>成功付款的时候，钱会从买家账户打到商家账户</p>
<p>商家账号：</p>
<p><img loading="lazy" decoding="async" width="999" height="445" class="wp-image-8559" src="/wp-content/uploads/2018/06/word-image-1130.png" srcset="/wp-content/uploads/2018/06/word-image-1130.png 999w, /wp-content/uploads/2018/06/word-image-1130-300x134.png 300w, /wp-content/uploads/2018/06/word-image-1130-768x342.png 768w" sizes="(max-width: 999px) 100vw, 999px" /></p>
<p>买家账号：</p>
<p><img loading="lazy" decoding="async" width="570" height="363" class="wp-image-8560" src="/wp-content/uploads/2018/06/word-image-1131.png" srcset="/wp-content/uploads/2018/06/word-image-1131.png 570w, /wp-content/uploads/2018/06/word-image-1131-300x191.png 300w" sizes="(max-width: 570px) 100vw, 570px" /></p>
<p>特别注意一点：</p>
<p><img loading="lazy" decoding="async" width="738" height="60" class="wp-image-8561" src="/wp-content/uploads/2018/06/word-image-1132.png" srcset="/wp-content/uploads/2018/06/word-image-1132.png 738w, /wp-content/uploads/2018/06/word-image-1132-300x24.png 300w" sizes="(max-width: 738px) 100vw, 738px" /></p>
<h2>3、下载支付宝支付的开发包SDK&amp;Demo</h2>
<p>下载地址：<a href="/goto/9m2k" rel="nofollow">https://docs.open.alipay.com/270/106291</a></p>
<p><img loading="lazy" decoding="async" width="1178" height="403" class="wp-image-8562" src="/wp-content/uploads/2018/06/word-image-1133.png" srcset="/wp-content/uploads/2018/06/word-image-1133.png 1178w, /wp-content/uploads/2018/06/word-image-1133-300x103.png 300w, /wp-content/uploads/2018/06/word-image-1133-768x263.png 768w, /wp-content/uploads/2018/06/word-image-1133-1024x350.png 1024w" sizes="(max-width: 1178px) 100vw, 1178px" /></p>
<p>下载回来的压缩包如下：</p>
<p><img loading="lazy" decoding="async" width="224" height="28" class="wp-image-8563" src="/wp-content/uploads/2018/06/word-image-1134.png" /></p>
<p>解压下来如下所示：</p>
<p><img loading="lazy" decoding="async" width="275" height="293" class="wp-image-8564" src="/wp-content/uploads/2018/06/word-image-1135.png" /></p>
<p>aop：包含<strong>支付宝核心的支付文</strong>件。</p>
<p>lotusphp_runtime： 这是一个国外的PHP框架，这里是支付宝默认使用的。</p>
<p>pagepay：具体的实现支付接口的代码文件</p>
<p>config.php：配置文件，填写应用配置APPID、应用密钥、支付宝、支付网关的文件</p>
<p>notify_url.php：支付成功以后支付宝post方式异步跳转的地址，获取支付结果的地址</p>
<p>return_url.php：支付成功以后支付宝get方式同步跳转的地址，获取支付结果的地址</p>
<p>注：支付宝接口对我们的PHP版本有要求，必须在PHP5.5以上，可以使用phpStudy集成环境进行切换。且需要开启对应php版本的php.ini配置文件中的openssl扩展，去掉前面的分号，并重启apache服务器：</p>
<p><img loading="lazy" decoding="async" width="660" height="204" class="wp-image-8565" src="/wp-content/uploads/2018/06/word-image-1136.png" srcset="/wp-content/uploads/2018/06/word-image-1136.png 660w, /wp-content/uploads/2018/06/word-image-1136-300x93.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<h1>集成支付宝到项目中</h1>
<h2>1、引入支付宝到项目中</h2>
<h2>2、支付前的相关参数配置</h2>
<p>几个重要的配置参数：</p>
<ul>
<li>APPID:可以从支付宝的沙箱应用中获取到</li>
<li>支付宝支付网关</li>
</ul>
<p>沙箱环境：<a href="/goto/56zy" rel="nofollow">https://openapi.alipaydev.com/gateway.do</a></p>
<p>正式环境：<a href="/goto/56zy" rel="nofollow">https://openapi.alipay.com/gateway.do</a></p>
<p>提示：以后去公司做支付宝支付时，上线要使用正式环境的支付网关</p>
<ul>
<li>应用私钥</li>
<li>应用公钥</li>
</ul>
<p>其中应用私钥和公钥可通过支付宝提供的相关工具生成。</p>
<p><img loading="lazy" decoding="async" width="504" height="155" class="wp-image-8566" src="/wp-content/uploads/2018/06/word-image-1137.png" srcset="/wp-content/uploads/2018/06/word-image-1137.png 504w, /wp-content/uploads/2018/06/word-image-1137-300x92.png 300w" sizes="(max-width: 504px) 100vw, 504px" /></p>
<ul>
<li>支付宝公钥</li>
</ul>
<p>我们直接运行RSA签名验签工具</p>
<p><img loading="lazy" decoding="async" width="340" height="216" class="wp-image-8567" src="/wp-content/uploads/2018/06/word-image-1138.png" srcset="/wp-content/uploads/2018/06/word-image-1138.png 340w, /wp-content/uploads/2018/06/word-image-1138-300x191.png 300w" sizes="(max-width: 340px) 100vw, 340px" /></p>
<p>签名：说白了就是加密</p>
<p>验签：说白了判断加密是否正确，</p>
<p>例如:</p>
<p>我们注册会员的时候，会给会员密码加密，你可以理解，我们给会员的密码进行签名，</p>
<p>会员会在网站登录，我们直接从数据库找出密码的加密串 和 会员注册时的密码加密后进行判断，这个动作可以理解为验签</p>
<p>我们使用RSA签名验签工具生成应用的私钥和公钥：</p>
<p><img loading="lazy" decoding="async" width="788" height="661" class="wp-image-8568" src="/wp-content/uploads/2018/06/word-image-1139.png" srcset="/wp-content/uploads/2018/06/word-image-1139.png 788w, /wp-content/uploads/2018/06/word-image-1139-300x252.png 300w, /wp-content/uploads/2018/06/word-image-1139-768x644.png 768w" sizes="(max-width: 788px) 100vw, 788px" /></p>
<p>商户的私钥：复制到config.php中。</p>
<p>商户的公钥：复制到支付宝网站中，再获取支付宝的公钥复制到config.php中</p>
<p>应用私钥和应用公钥，支付宝公钥说明：</p>
<p><img loading="lazy" decoding="async" width="1201" height="681" class="wp-image-8569" src="/wp-content/uploads/2018/06/word-image-1140.png" srcset="/wp-content/uploads/2018/06/word-image-1140.png 1201w, /wp-content/uploads/2018/06/word-image-1140-300x170.png 300w, /wp-content/uploads/2018/06/word-image-1140-768x435.png 768w, /wp-content/uploads/2018/06/word-image-1140-1024x581.png 1024w" sizes="(max-width: 1201px) 100vw, 1201px" /></p>
<p>config.php配置文件如下：</p>
<h2>分析如何唤起支付宝支付页面</h2>
<h2>实现商城订单的支付</h2>
<h1>十、查看个人订单列表</h1>
<h1>十一、后台订单管理</h1>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8378.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP5 商城（九）订单入库、支付宝支付、支付宝引入项目、支付页面唤起、订单支付、支付成功订单状态修改、订单入库验证、查看个人订单、订单付款、后台订单管理、无刷新分页</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8570.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8570.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 08 Jun 2018 00:32:43 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></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>
		<category><![CDATA[订单入库验证]]></category>
		<category><![CDATA[订单支付]]></category>
		<guid isPermaLink="false">/?p=8570</guid>

					<description><![CDATA[商城第九天 商城难点重点 构造数组结构（看业务场景，查看数据表现形式） rbac获取所有的权限&#8212;》 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>商城第九天</h1>
<h1>商城难点重点</h1>
<ol>
<li>构造数组结构（看业务场景，查看数据表现形式）</li>
</ol>
<p>rbac获取所有的权限&#8212;》两个技巧</p>
<p>商品详情页单选属性&#8212;》通过attr_id分组</p>
<p>购物车列表 &#8211;》加两个下标 goodsInfo attrInfo</p>
<p>后台商品添加动态拼接商品类型属性&#8211;》动态属性入库（表单name拼接[]）</p>
<h1>完成订单数据入库</h1>
<p><img loading="lazy" decoding="async" width="1110" height="546" class="wp-image-8571" src="/wp-content/uploads/2018/06/word-image-1141.png" srcset="/wp-content/uploads/2018/06/word-image-1141.png 1110w, /wp-content/uploads/2018/06/word-image-1141-300x148.png 300w, /wp-content/uploads/2018/06/word-image-1141-768x378.png 768w, /wp-content/uploads/2018/06/word-image-1141-1024x504.png 1024w" sizes="(max-width: 1110px) 100vw, 1110px" /></p>
<h2>订单数据入库的顺序</h2>
<p>订单商品入库的顺序：</p>
<p>第一步：先把订单基本数据入库到订单表sh_order</p>
<p>第二步：订单表数据入库成功之后才能把订单商品入库到订单商品表中sh_order_goods中</p>
<p>如果保证上面两步执行过程中都没有问题呢，这里需要借助到mysql的事务，可以保持数据的一致性。当发生异常的时候，会自动回滚。</p>
<p>注意：只有表的引擎是innodb引擎才支持事务操作。</p>
<p>TP5中有关事务操作的相关方法：</p>
<p>启动事务：Db::startTrans()</p>
<p>提交事务：Db::commit()</p>
<p>事务回滚：Db::rollback()</p>
<p>手册示例：</p>
<p><img loading="lazy" decoding="async" width="422" height="252" class="wp-image-8572" src="/wp-content/uploads/2018/06/word-image-1142.png" srcset="/wp-content/uploads/2018/06/word-image-1142.png 422w, /wp-content/uploads/2018/06/word-image-1142-300x180.png 300w" sizes="(max-width: 422px) 100vw, 422px" /></p>
<p>订单商品入库的顺序：</p>
<p>第一步：先把订单基本数据入库到订单表sh_order</p>
<p>第二步：订单表数据入库成功之后才能把订单商品入库到订单商品表中sh_order_goods中</p>
<p>如果保证上面两步执行过程中都没有问题呢，这里需要借助到mysql的事务，可以保持数据的一致性。当发生异常的时候，会自动回滚。</p>
<p>注意：只有表的引擎是innodb引擎才支持事务操作。</p>
<p>订单表（sh_order）和订单商品表(sh_order_goods)的关系：</p>
<p><img loading="lazy" decoding="async" width="432" height="302" class="wp-image-8573" src="/wp-content/uploads/2018/06/word-image-1143.png" srcset="/wp-content/uploads/2018/06/word-image-1143.png 432w, /wp-content/uploads/2018/06/word-image-1143-300x210.png 300w" sizes="(max-width: 432px) 100vw, 432px" /></p>
<p>TP5中有关事务操作的相关方法：</p>
<p>启动事务：Db::startTrans()</p>
<p>提交事务：Db::commit()</p>
<p>事务回滚：Db::rollback()</p>
<p>手册示例：</p>
<p><img loading="lazy" decoding="async" width="422" height="252" class="wp-image-8574" src="/wp-content/uploads/2018/06/word-image-1144.png" srcset="/wp-content/uploads/2018/06/word-image-1144.png 422w, /wp-content/uploads/2018/06/word-image-1144-300x180.png 300w" sizes="(max-width: 422px) 100vw, 422px" /></p>
<p>注：只要在try{}中抛出出一个异常throw new \Exception(‘失败信息’) ，就会执行catch中的回滚操作，$e-&gt;getMessage(失败信息);</p>
<h2>订单表和订单商品表的数据入库</h2>
<p>入库流程图：</p>
<p><img loading="lazy" decoding="async" width="835" height="386" class="wp-image-8575" src="/wp-content/uploads/2018/06/word-image-1145.png" srcset="/wp-content/uploads/2018/06/word-image-1145.png 835w, /wp-content/uploads/2018/06/word-image-1145-300x139.png 300w, /wp-content/uploads/2018/06/word-image-1145-768x355.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></p>
<ol>
<li>在订单结算页面，设置好表单的name字段，或收货人的基本信息（收货地址、电话、邮编）</li>
</ol>
<p><img loading="lazy" decoding="async" width="549" height="210" class="wp-image-8576" src="/wp-content/uploads/2018/06/word-image-1146.png" srcset="/wp-content/uploads/2018/06/word-image-1146.png 549w, /wp-content/uploads/2018/06/word-image-1146-300x115.png 300w" sizes="(max-width: 549px) 100vw, 549px" /> <img loading="lazy" decoding="async" width="1130" height="529" class="wp-image-8577" src="/wp-content/uploads/2018/06/word-image-1147.png" srcset="/wp-content/uploads/2018/06/word-image-1147.png 1130w, /wp-content/uploads/2018/06/word-image-1147-300x140.png 300w, /wp-content/uploads/2018/06/word-image-1147-768x360.png 768w, /wp-content/uploads/2018/06/word-image-1147-1024x479.png 1024w" sizes="(max-width: 1130px) 100vw, 1130px" /></p>
<p>给提交按钮，绑定单击事件，让上面的表单进行提交：</p>
<p><img loading="lazy" decoding="async" width="392" height="63" class="wp-image-8578" src="/wp-content/uploads/2018/06/word-image-1148.png" srcset="/wp-content/uploads/2018/06/word-image-1148.png 392w, /wp-content/uploads/2018/06/word-image-1148-300x48.png 300w" sizes="(max-width: 392px) 100vw, 392px" /> <img loading="lazy" decoding="async" width="960" height="205" class="wp-image-8579" src="/wp-content/uploads/2018/06/word-image-1149.png" srcset="/wp-content/uploads/2018/06/word-image-1149.png 960w, /wp-content/uploads/2018/06/word-image-1149-300x64.png 300w, /wp-content/uploads/2018/06/word-image-1149-768x164.png 768w" sizes="(max-width: 960px) 100vw, 960px" /> <img loading="lazy" decoding="async" width="775" height="234" class="wp-image-8580" src="/wp-content/uploads/2018/06/word-image-1150.png" srcset="/wp-content/uploads/2018/06/word-image-1150.png 775w, /wp-content/uploads/2018/06/word-image-1150-300x91.png 300w, /wp-content/uploads/2018/06/word-image-1150-768x232.png 768w" sizes="(max-width: 775px) 100vw, 775px" /></p>
<p>注：表单跳转还是跳转到当前控制器方法，属于post方式提交（method=post）</p>
<ol>
<li>在方法_writeOrder中，开启事务，保证订单商品入库成功</li>
</ol>
<p><img loading="lazy" decoding="async" width="657" height="430" class="wp-image-8581" src="/wp-content/uploads/2018/06/word-image-1151.png" srcset="/wp-content/uploads/2018/06/word-image-1151.png 657w, /wp-content/uploads/2018/06/word-image-1151-300x196.png 300w" sizes="(max-width: 657px) 100vw, 657px" /> <img loading="lazy" decoding="async" width="1258" height="633" class="wp-image-8582" src="/wp-content/uploads/2018/06/word-image-1152.png" srcset="/wp-content/uploads/2018/06/word-image-1152.png 1258w, /wp-content/uploads/2018/06/word-image-1152-300x151.png 300w, /wp-content/uploads/2018/06/word-image-1152-768x386.png 768w, /wp-content/uploads/2018/06/word-image-1152-1024x515.png 1024w" sizes="(max-width: 1258px) 100vw, 1258px" /></p>
<ol>
<li>在try{}中进行订单表的数据入库，和订单商品表数据的入库</li>
</ol>
<p><img loading="lazy" decoding="async" width="1242" height="565" class="wp-image-8583" src="/wp-content/uploads/2018/06/word-image-1153.png" srcset="/wp-content/uploads/2018/06/word-image-1153.png 1242w, /wp-content/uploads/2018/06/word-image-1153-300x136.png 300w, /wp-content/uploads/2018/06/word-image-1153-768x349.png 768w, /wp-content/uploads/2018/06/word-image-1153-1024x466.png 1024w" sizes="(max-width: 1242px) 100vw, 1242px" /> <img loading="lazy" decoding="async" width="1240" height="690" class="wp-image-8584" src="/wp-content/uploads/2018/06/word-image-1154.png" srcset="/wp-content/uploads/2018/06/word-image-1154.png 1240w, /wp-content/uploads/2018/06/word-image-1154-300x167.png 300w, /wp-content/uploads/2018/06/word-image-1154-768x427.png 768w, /wp-content/uploads/2018/06/word-image-1154-1024x570.png 1024w" sizes="(max-width: 1240px) 100vw, 1240px" /></p>
<p>注：上面的代码需要引入Db类</p>
<p>同时建立订单表和订单商品表的模型：</p>
<p><img loading="lazy" decoding="async" width="752" height="253" class="wp-image-8585" src="/wp-content/uploads/2018/06/word-image-1155.png" srcset="/wp-content/uploads/2018/06/word-image-1155.png 752w, /wp-content/uploads/2018/06/word-image-1155-300x101.png 300w" sizes="(max-width: 752px) 100vw, 752px" /> <img loading="lazy" decoding="async" width="660" height="224" class="wp-image-8586" src="/wp-content/uploads/2018/06/word-image-1156.png" srcset="/wp-content/uploads/2018/06/word-image-1156.png 660w, /wp-content/uploads/2018/06/word-image-1156-300x102.png 300w" sizes="(max-width: 660px) 100vw, 660px" /> <img loading="lazy" decoding="async" width="512" height="67" class="wp-image-8587" src="/wp-content/uploads/2018/06/word-image-1157.png" srcset="/wp-content/uploads/2018/06/word-image-1157.png 512w, /wp-content/uploads/2018/06/word-image-1157-300x39.png 300w" sizes="(max-width: 512px) 100vw, 512px" /></p>
<h1>二、支付技术介绍</h1>
<h2>1、早期网站支付</h2>
<p>早期的电商都是送货上门，邮政汇款，这样的话，商家会承担很大的风险。</p>
<p>后面的时候有部分网站和银行进行签约，使用网银、手机银行等。</p>
<p>再往后，就是支付宝、微信。</p>
<p>早期的公司如果想申请网银需要直接去找银行申请相关的支付接口，而且现在银行这么多公司不可能去每家银行申请支付接口，这样未免也太麻烦了。</p>
<p><img loading="lazy" decoding="async" width="493" height="189" class="wp-image-8588" src="/wp-content/uploads/2018/06/word-image-1158.png" srcset="/wp-content/uploads/2018/06/word-image-1158.png 493w, /wp-content/uploads/2018/06/word-image-1158-300x115.png 300w" sizes="(max-width: 493px) 100vw, 493px" /></p>
<p>如果有的网站的资金流动比较少的话，有的银行都不会和这些小公司进行合作，因为从中赚不到什么利润。所以就有了第三方支付平台（微信、支付宝、京东钱包、qq财付通、百度钱包）来解决这些问题。</p>
<p><img loading="lazy" decoding="async" width="625" height="173" class="wp-image-8589" src="/wp-content/uploads/2018/06/word-image-1159.png" srcset="/wp-content/uploads/2018/06/word-image-1159.png 625w, /wp-content/uploads/2018/06/word-image-1159-300x83.png 300w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<h2>2、现在的网站支付</h2>
<p>为了解决早期网站支付的问题，避免了商家繁琐的去每家银行获取支付接口。现在有些公司专门集合了所有银行的支付接口，这些公司进而在提供支付接口给我们企业或开发者使用，这些公司就是第三方支付平台。</p>
<p>常见的第三方支付平台：微信、支付宝、京东钱包、qq财付通、百度钱包等</p>
<p>有了这些第三方支付平台，我们企业或开发者就不需要独自跑去银行去申请支付接口了，直接利用第三方支付平台，在参考他们的支付接口文档即可完成我们的支付了！</p>
<h1>三、支付宝支付</h1>
<p>注意一点：现在的支付宝支付需要企业或个体工商户可申请才，个人是没法申请的。</p>
<p>企业或个体工商户申请的条件如下：</p>
<p>1. 提供真实有效的营业执照，且支付宝账户名称需与营业执照主体一致；</p>
<p>2. 网站能正常访问且页面信息有完整商品内容；</p>
<p>3. 网站必须通过ICP备案，个体户备案需与账户主体一致。</p>
<p>（团购类网站不支持个体工商户签约）</p>
<p>不过好处的个人开发者我们可以使用支付宝提供的沙箱环境进行模拟支付。</p>
<p>那么什么是沙箱环境？</p>
<p>答：就是支付宝提供给我们开发者一个虚拟的支付环境。其中的操作和真实支付环境是完全一样的。买家账号和卖家账号沙箱环境都给我们提供好了。</p>
<p>后面的沙箱环境支付，支付宝会提供一个商家账户和个人买家账户给我们，我们在配合支付接口文档即可完成支付。</p>
<h2>企业或个体工商户申请支付</h2>
<p>申请的网址：<a href="/goto/pv02" rel="nofollow">https://b.alipay.com/</a> （b: business企业）</p>
<p>点击下面的电脑网站支付的接入按钮：</p>
<p><img loading="lazy" decoding="async" width="1277" height="644" class="wp-image-8590" src="/wp-content/uploads/2018/06/word-image-1160.png" srcset="/wp-content/uploads/2018/06/word-image-1160.png 1277w, /wp-content/uploads/2018/06/word-image-1160-300x151.png 300w, /wp-content/uploads/2018/06/word-image-1160-768x387.png 768w, /wp-content/uploads/2018/06/word-image-1160-1024x516.png 1024w" sizes="(max-width: 1277px) 100vw, 1277px" /></p>
<p>这里支付宝提供了5种支付方式给我们使用，网站就要使用电脑网站支付。</p>
<p>早期支付宝只有两种支付方式：</p>
<p>即时到帐：我们上面看到的5个支付方式都是这个衍生出来的 ，一旦付款，立马到账。</p>
<p>担保支付： 7天担保，早期淘宝网，买家买东西的钱先到了淘宝的帐号呆够7天，商家才收到款，担保支付支付宝已经取消了。</p>
<p>企业或个体户点击上面电脑网站支付，需要以下申请条件：</p>
<p><img loading="lazy" decoding="async" width="739" height="367" class="wp-image-8591" src="/wp-content/uploads/2018/06/word-image-1161.png" srcset="/wp-content/uploads/2018/06/word-image-1161.png 739w, /wp-content/uploads/2018/06/word-image-1161-300x149.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></p>
<p>上面的申请条件，以后去企业上班，公司都会帮我们申请好的。</p>
<p>上面是企业或个体工商户申请的基本步骤，我们个人没法申请，所以这里我们只能使用沙箱环境进行支付测试。</p>
<h2>申请沙箱应用</h2>
<p>首页，登陆支付宝开放平台，进入到如下的开发者中心</p>
<p><a href="/goto/kris" rel="nofollow">https://openhome.alipay.com/platform/developerIndex.htm</a></p>
<p><img loading="lazy" decoding="async" width="825" height="208" class="wp-image-8592" src="/wp-content/uploads/2018/06/word-image-1162.png" srcset="/wp-content/uploads/2018/06/word-image-1162.png 825w, /wp-content/uploads/2018/06/word-image-1162-300x76.png 300w, /wp-content/uploads/2018/06/word-image-1162-768x194.png 768w" sizes="(max-width: 825px) 100vw, 825px" /></p>
<p>点击开发者中心-&gt;研发服务，进入如下的沙箱环境：</p>
<p>去创建沙箱应用,如下是已经创建的沙箱环境：</p>
<p><img loading="lazy" decoding="async" width="1088" height="623" class="wp-image-8593" src="/wp-content/uploads/2018/06/word-image-1163.png" srcset="/wp-content/uploads/2018/06/word-image-1163.png 1088w, /wp-content/uploads/2018/06/word-image-1163-300x172.png 300w, /wp-content/uploads/2018/06/word-image-1163-768x440.png 768w, /wp-content/uploads/2018/06/word-image-1163-1024x586.png 1024w" sizes="(max-width: 1088px) 100vw, 1088px" /></p>
<p>沙箱中的提供两个测试账户：商家账户 和 买家账户，其账户余额都是虚拟的</p>
<p>成功付款的时候，钱会从买家账户打到商家账户</p>
<p>商家账号：</p>
<p><img loading="lazy" decoding="async" width="999" height="445" class="wp-image-8594" src="/wp-content/uploads/2018/06/word-image-1164.png" srcset="/wp-content/uploads/2018/06/word-image-1164.png 999w, /wp-content/uploads/2018/06/word-image-1164-300x134.png 300w, /wp-content/uploads/2018/06/word-image-1164-768x342.png 768w" sizes="(max-width: 999px) 100vw, 999px" /></p>
<p>买家账号：</p>
<p><img loading="lazy" decoding="async" width="570" height="363" class="wp-image-8595" src="/wp-content/uploads/2018/06/word-image-1165.png" srcset="/wp-content/uploads/2018/06/word-image-1165.png 570w, /wp-content/uploads/2018/06/word-image-1165-300x191.png 300w" sizes="(max-width: 570px) 100vw, 570px" /></p>
<p>特别注意一点：</p>
<p><img loading="lazy" decoding="async" width="738" height="60" class="wp-image-8596" src="/wp-content/uploads/2018/06/word-image-1166.png" srcset="/wp-content/uploads/2018/06/word-image-1166.png 738w, /wp-content/uploads/2018/06/word-image-1166-300x24.png 300w" sizes="(max-width: 738px) 100vw, 738px" /></p>
<h2>3、下载支付宝支付的开发包SDK&amp;Demo</h2>
<p>下载地址：<a href="/goto/9m2k" rel="nofollow">https://docs.open.alipay.com/270/106291</a></p>
<p><img loading="lazy" decoding="async" width="1178" height="403" class="wp-image-8597" src="/wp-content/uploads/2018/06/word-image-1167.png" srcset="/wp-content/uploads/2018/06/word-image-1167.png 1178w, /wp-content/uploads/2018/06/word-image-1167-300x103.png 300w, /wp-content/uploads/2018/06/word-image-1167-768x263.png 768w, /wp-content/uploads/2018/06/word-image-1167-1024x350.png 1024w" sizes="(max-width: 1178px) 100vw, 1178px" /></p>
<p>下载回来的压缩包如下：</p>
<p><img loading="lazy" decoding="async" width="224" height="28" class="wp-image-8598" src="/wp-content/uploads/2018/06/word-image-1168.png" /></p>
<p>解压下来如下所示：</p>
<p><img loading="lazy" decoding="async" width="275" height="293" class="wp-image-8599" src="/wp-content/uploads/2018/06/word-image-1169.png" /></p>
<p>aop：包含<strong>支付宝核心的支付文</strong>件。</p>
<p>lotusphp_runtime： 这是一个国外的PHP框架，这里是支付宝默认使用的。</p>
<p>pagepay：具体的实现支付接口的代码文件</p>
<p>config.php：配置文件，填写应用配置APPID、应用密钥、支付宝、支付网关的文件</p>
<p>notify_url.php：支付成功以后支付宝post方式异步跳转的地址，获取支付结果的地址</p>
<p>return_url.php：支付成功以后支付宝get方式同步跳转的地址，获取支付结果的地址</p>
<p>注：支付宝接口对我们的PHP版本有要求，必须在PHP5.5以上，可以使用phpStudy集成环境进行切换。且需要开启对应php版本的php.ini配置文件中的openssl扩展，去掉前面的分号，并重启apache服务器：</p>
<p><img loading="lazy" decoding="async" width="660" height="204" class="wp-image-8600" src="/wp-content/uploads/2018/06/word-image-1170.png" srcset="/wp-content/uploads/2018/06/word-image-1170.png 660w, /wp-content/uploads/2018/06/word-image-1170-300x93.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<h1>四、集成支付宝到项目中</h1>
<h2>1、引入支付宝到项目中</h2>
<p>1、把下载下来的压缩包进行解压，把所有的文件复制到/public/alipay/目录下面</p>
<p><img loading="lazy" decoding="async" width="894" height="410" class="wp-image-8601" src="/wp-content/uploads/2018/06/word-image-1171.png" srcset="/wp-content/uploads/2018/06/word-image-1171.png 894w, /wp-content/uploads/2018/06/word-image-1171-300x138.png 300w, /wp-content/uploads/2018/06/word-image-1171-768x352.png 768w" sizes="(max-width: 894px) 100vw, 894px" /></p>
<h2>支付前的相关参数配置</h2>
<p>几个重要的配置参数：</p>
<ul>
<li>APPID:可以从支付宝的沙箱应用中获取到</li>
<li>支付宝支付网关</li>
</ul>
<p>沙箱环境：<a href="/goto/56zy" rel="nofollow">https://openapi.alipaydev.com/gateway.do</a></p>
<p>正式环境：<a href="/goto/56zy" rel="nofollow">https://openapi.alipay.com/gateway.do</a></p>
<p>提示：以后去公司做支付宝支付时，上线要使用正式环境的支付网关</p>
<ul>
<li>应用私钥</li>
<li>应用公钥</li>
</ul>
<p>其中应用私钥和公钥可通过支付宝提供的相关工具生成。</p>
<p><img loading="lazy" decoding="async" width="504" height="155" class="wp-image-8602" src="/wp-content/uploads/2018/06/word-image-1172.png" srcset="/wp-content/uploads/2018/06/word-image-1172.png 504w, /wp-content/uploads/2018/06/word-image-1172-300x92.png 300w" sizes="(max-width: 504px) 100vw, 504px" /></p>
<ul>
<li>支付宝公钥</li>
</ul>
<p>我们直接运行RSA签名验签工具</p>
<p><img loading="lazy" decoding="async" width="340" height="216" class="wp-image-8603" src="/wp-content/uploads/2018/06/word-image-1173.png" srcset="/wp-content/uploads/2018/06/word-image-1173.png 340w, /wp-content/uploads/2018/06/word-image-1173-300x191.png 300w" sizes="(max-width: 340px) 100vw, 340px" /></p>
<p>签名：说白了就是加密</p>
<p>验签：说白了判断加密是否正确，</p>
<p>例如:</p>
<p>我们注册会员的时候，会给会员密码加密，你可以理解，我们给会员的密码进行签名，</p>
<p>会员会在网站登录，我们直接从数据库找出密码的加密串 和 会员注册时的密码加密后进行判断，这个动作可以理解为验签</p>
<p>我们使用RSA签名验签工具生成应用的私钥和公钥：</p>
<p><img loading="lazy" decoding="async" width="788" height="661" class="wp-image-8604" src="/wp-content/uploads/2018/06/word-image-1174.png" srcset="/wp-content/uploads/2018/06/word-image-1174.png 788w, /wp-content/uploads/2018/06/word-image-1174-300x252.png 300w, /wp-content/uploads/2018/06/word-image-1174-768x644.png 768w" sizes="(max-width: 788px) 100vw, 788px" /></p>
<p>商户的私钥：复制到config.php中。</p>
<p>商户的公钥：复制到支付宝网站中，再获取支付宝的公钥复制到config.php中</p>
<p>应用私钥和应用公钥，支付宝公钥说明：</p>
<p><img loading="lazy" decoding="async" width="1201" height="681" class="wp-image-8605" src="/wp-content/uploads/2018/06/word-image-1175.png" srcset="/wp-content/uploads/2018/06/word-image-1175.png 1201w, /wp-content/uploads/2018/06/word-image-1175-300x170.png 300w, /wp-content/uploads/2018/06/word-image-1175-768x435.png 768w, /wp-content/uploads/2018/06/word-image-1175-1024x581.png 1024w" sizes="(max-width: 1201px) 100vw, 1201px" /></p>
<p>修改config.php文件：</p>
<p><img loading="lazy" decoding="async" width="1250" height="527" class="wp-image-8606" src="/wp-content/uploads/2018/06/word-image-1176.png" srcset="/wp-content/uploads/2018/06/word-image-1176.png 1250w, /wp-content/uploads/2018/06/word-image-1176-300x126.png 300w, /wp-content/uploads/2018/06/word-image-1176-768x324.png 768w, /wp-content/uploads/2018/06/word-image-1176-1024x432.png 1024w" sizes="(max-width: 1250px) 100vw, 1250px" /> <img loading="lazy" decoding="async" width="1253" height="351" class="wp-image-8607" src="/wp-content/uploads/2018/06/word-image-1177.png" srcset="/wp-content/uploads/2018/06/word-image-1177.png 1253w, /wp-content/uploads/2018/06/word-image-1177-300x84.png 300w, /wp-content/uploads/2018/06/word-image-1177-768x215.png 768w, /wp-content/uploads/2018/06/word-image-1177-1024x287.png 1024w" sizes="(max-width: 1253px) 100vw, 1253px" /></p>
<p>配置好之后，进行访问，如果能够出现一个支付宝的支付页面，说明配置参数成功：</p>
<p><img loading="lazy" decoding="async" width="820" height="321" class="wp-image-8608" src="/wp-content/uploads/2018/06/word-image-1178.png" srcset="/wp-content/uploads/2018/06/word-image-1178.png 820w, /wp-content/uploads/2018/06/word-image-1178-300x117.png 300w, /wp-content/uploads/2018/06/word-image-1178-768x301.png 768w" sizes="(max-width: 820px) 100vw, 820px" /> <img loading="lazy" decoding="async" width="1080" height="562" class="wp-image-8609" src="/wp-content/uploads/2018/06/word-image-1179.png" srcset="/wp-content/uploads/2018/06/word-image-1179.png 1080w, /wp-content/uploads/2018/06/word-image-1179-300x156.png 300w, /wp-content/uploads/2018/06/word-image-1179-768x400.png 768w, /wp-content/uploads/2018/06/word-image-1179-1024x533.png 1024w" sizes="(max-width: 1080px) 100vw, 1080px" /></p>
<p>之后通过沙箱中的买家账号和密码进行支付即可。</p>
<h2>分析如何唤起支付宝支付页面</h2>
<p>支付流程图解：</p>
<p><img loading="lazy" decoding="async" width="882" height="586" class="wp-image-8610" src="/wp-content/uploads/2018/06/word-image-1180.png" srcset="/wp-content/uploads/2018/06/word-image-1180.png 882w, /wp-content/uploads/2018/06/word-image-1180-300x199.png 300w, /wp-content/uploads/2018/06/word-image-1180-768x510.png 768w" sizes="(max-width: 882px) 100vw, 882px" /></p>
<p>当单击支付按钮的时候，跳转到pagepay/pagepay.php文件中进行支付，此页面才是跳转到支付宝的真正支付页面。</p>
<p><img loading="lazy" decoding="async" width="943" height="610" class="wp-image-8611" src="/wp-content/uploads/2018/06/word-image-1181.png" srcset="/wp-content/uploads/2018/06/word-image-1181.png 943w, /wp-content/uploads/2018/06/word-image-1181-300x194.png 300w, /wp-content/uploads/2018/06/word-image-1181-768x497.png 768w" sizes="(max-width: 943px) 100vw, 943px" /></p>
<p>文件如下：</p>
<p><img loading="lazy" decoding="async" width="1142" height="405" class="wp-image-8612" src="/wp-content/uploads/2018/06/word-image-1182.png" srcset="/wp-content/uploads/2018/06/word-image-1182.png 1142w, /wp-content/uploads/2018/06/word-image-1182-300x106.png 300w, /wp-content/uploads/2018/06/word-image-1182-768x272.png 768w, /wp-content/uploads/2018/06/word-image-1182-1024x363.png 1024w" sizes="(max-width: 1142px) 100vw, 1142px" /></p>
<p>即，后面只要在支付的时候，引入上面的pagepay/pagepay.php文件即可完成支付。</p>
<h2>实现商城订单的支付</h2>
<p>1、上面配置没有问题的话，且可以出现支付页面，我们就可以把/public/alipay目录复制到extend/目录下面：</p>
<p><img loading="lazy" decoding="async" width="704" height="326" class="wp-image-8613" src="/wp-content/uploads/2018/06/word-image-1183.png" srcset="/wp-content/uploads/2018/06/word-image-1183.png 704w, /wp-content/uploads/2018/06/word-image-1183-300x139.png 300w" sizes="(max-width: 704px) 100vw, 704px" /></p>
<ol>
<li>当订单数据入库成功之后，需要引入上面的pagepay/pagepay.php文件进行支付，这里我们封装在一个支付的方法_payMoney()中。方便后面支付调用</li>
</ol>
<p><img loading="lazy" decoding="async" width="1201" height="540" class="wp-image-8614" src="/wp-content/uploads/2018/06/word-image-1184.png" srcset="/wp-content/uploads/2018/06/word-image-1184.png 1201w, /wp-content/uploads/2018/06/word-image-1184-300x135.png 300w, /wp-content/uploads/2018/06/word-image-1184-768x345.png 768w, /wp-content/uploads/2018/06/word-image-1184-1024x460.png 1024w" sizes="(max-width: 1201px) 100vw, 1201px" /></p>
<p>同时需要把pagepay.php文件中的原本是$_POST的变量改为我们上面定义的$payData变量。</p>
<p>之所以要更改是因为后面个人订单支付也可以采用get方式进行传参支付。这样支付就更加灵活。</p>
<p><img loading="lazy" decoding="async" width="1089" height="529" class="wp-image-8615" src="/wp-content/uploads/2018/06/word-image-1185.png" srcset="/wp-content/uploads/2018/06/word-image-1185.png 1089w, /wp-content/uploads/2018/06/word-image-1185-300x146.png 300w, /wp-content/uploads/2018/06/word-image-1185-768x373.png 768w, /wp-content/uploads/2018/06/word-image-1185-1024x497.png 1024w" sizes="(max-width: 1089px) 100vw, 1089px" /></p>
<p>测试下商品加入购物车进行订单支付，如果下面付款的总金额一致，说明集成项目中成功</p>
<p><img loading="lazy" decoding="async" width="975" height="544" class="wp-image-8616" src="/wp-content/uploads/2018/06/word-image-1186.png" srcset="/wp-content/uploads/2018/06/word-image-1186.png 975w, /wp-content/uploads/2018/06/word-image-1186-300x167.png 300w, /wp-content/uploads/2018/06/word-image-1186-768x429.png 768w" sizes="(max-width: 975px) 100vw, 975px" /></p>
<h2>支付成功修改订单状态</h2>
<p>在上面的支付宝页面进行支付成功之后，会跳转到我们在config.php中设置好的return_url配置项的同步回调地址。</p>
<p><img loading="lazy" decoding="async" width="1152" height="367" class="wp-image-8617" src="/wp-content/uploads/2018/06/word-image-1187.png" srcset="/wp-content/uploads/2018/06/word-image-1187.png 1152w, /wp-content/uploads/2018/06/word-image-1187-300x96.png 300w, /wp-content/uploads/2018/06/word-image-1187-768x245.png 768w, /wp-content/uploads/2018/06/word-image-1187-1024x326.png 1024w" sizes="(max-width: 1152px) 100vw, 1152px" /></p>
<p>只要支付宝支付成功之后，就会往同步地址和异步地址进行跳转：</p>
<p><img loading="lazy" decoding="async" width="717" height="481" class="wp-image-8618" src="/wp-content/uploads/2018/06/word-image-1188.png" srcset="/wp-content/uploads/2018/06/word-image-1188.png 717w, /wp-content/uploads/2018/06/word-image-1188-300x201.png 300w" sizes="(max-width: 717px) 100vw, 717px" /></p>
<p>同步通知和异步通知的区别：</p>
<p>同步和异步通知携带的支付参数没有本质的区别：</p>
<p>同步通知：支付成功后返回到指定callback回调域，同时携带支付状态的get参数，让自己的网站用于验证（更新支付的状态）。</p>
<p>异步通知：其实是双保险机制，主要是防止意外情况。因为交易涉及到钱的问题，支付宝考虑到如果同步通知的过程中，用户不小心关闭浏览器或者浏览器卡死的情况，这样就无法实现同步通知，从而也就无法更新用户的支付状态(用户支付成功，但显示未付款)。而支付宝服务器会在一段时间内持续的往我们的服务器发送异步通知。直到返回给支付宝success即可，这个一段时间在1-2天内通知8次左右。</p>
<ol>
<li>在config.php中设置好同步的回调地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1236" height="424" class="wp-image-8619" src="/wp-content/uploads/2018/06/word-image-1189.png" srcset="/wp-content/uploads/2018/06/word-image-1189.png 1236w, /wp-content/uploads/2018/06/word-image-1189-300x103.png 300w, /wp-content/uploads/2018/06/word-image-1189-768x263.png 768w, /wp-content/uploads/2018/06/word-image-1189-1024x351.png 1024w" sizes="(max-width: 1236px) 100vw, 1236px" /></p>
<ol>
<li>建立一个同步回调的方法returnurl,打印get方法带来的支付成功参数</li>
</ol>
<p><img loading="lazy" decoding="async" width="1035" height="631" class="wp-image-8620" src="/wp-content/uploads/2018/06/word-image-1190.png" srcset="/wp-content/uploads/2018/06/word-image-1190.png 1035w, /wp-content/uploads/2018/06/word-image-1190-300x183.png 300w, /wp-content/uploads/2018/06/word-image-1190-768x468.png 768w, /wp-content/uploads/2018/06/word-image-1190-1024x624.png 1024w" sizes="(max-width: 1035px) 100vw, 1035px" /></p>
<p>打印get携带的支付成功的参数如下：</p>
<p><img loading="lazy" decoding="async" width="1085" height="313" class="wp-image-8621" src="/wp-content/uploads/2018/06/word-image-1191.png" srcset="/wp-content/uploads/2018/06/word-image-1191.png 1085w, /wp-content/uploads/2018/06/word-image-1191-300x87.png 300w, /wp-content/uploads/2018/06/word-image-1191-768x222.png 768w, /wp-content/uploads/2018/06/word-image-1191-1024x295.png 1024w" sizes="(max-width: 1085px) 100vw, 1085px" /></p>
<p>两个重要的参数：</p>
<p>out_trade_no :自己网站的订单号</p>
<p>trade_no:支付宝那么支付成功返回来的订单号</p>
<p>这里我们可以通过out_trade_no订单号进行修改订单的支付状态，把支付状态的字段pay_status改为1.</p>
<ol>
<li>修改订单的支付状态：</li>
</ol>
<p><img loading="lazy" decoding="async" width="983" height="659" class="wp-image-8622" src="/wp-content/uploads/2018/06/word-image-1192.png" srcset="/wp-content/uploads/2018/06/word-image-1192.png 983w, /wp-content/uploads/2018/06/word-image-1192-300x201.png 300w, /wp-content/uploads/2018/06/word-image-1192-768x515.png 768w" sizes="(max-width: 983px) 100vw, 983px" /></p>
<p>更改用户的支付状态和支付宝返回的订单号：</p>
<p><img loading="lazy" decoding="async" width="498" height="92" class="wp-image-8623" src="/wp-content/uploads/2018/06/word-image-1193.png" srcset="/wp-content/uploads/2018/06/word-image-1193.png 498w, /wp-content/uploads/2018/06/word-image-1193-300x55.png 300w" sizes="(max-width: 498px) 100vw, 498px" /></p>
<p>注：如果是线上环境，支付宝还会以post方式进行异步通知我们在config.php设置的异步回调地址。</p>
<p><img loading="lazy" decoding="async" width="1232" height="295" class="wp-image-8624" src="/wp-content/uploads/2018/06/word-image-1194.png" srcset="/wp-content/uploads/2018/06/word-image-1194.png 1232w, /wp-content/uploads/2018/06/word-image-1194-300x72.png 300w, /wp-content/uploads/2018/06/word-image-1194-768x184.png 768w, /wp-content/uploads/2018/06/word-image-1194-1024x245.png 1024w" sizes="(max-width: 1232px) 100vw, 1232px" /></p>
<p>异步代码也是更新订单的支付状态，只是把get接收方式改为post,且最后支付成功一定要echo一个success字符串给支付宝那边，否则支付宝在一段时间会一直通知，这个一段时间在1-2天内通知8次左右。</p>
<p><img loading="lazy" decoding="async" width="1033" height="664" class="wp-image-8625" src="/wp-content/uploads/2018/06/word-image-1195.png" srcset="/wp-content/uploads/2018/06/word-image-1195.png 1033w, /wp-content/uploads/2018/06/word-image-1195-300x193.png 300w, /wp-content/uploads/2018/06/word-image-1195-768x494.png 768w, /wp-content/uploads/2018/06/word-image-1195-1024x658.png 1024w" sizes="(max-width: 1033px) 100vw, 1033px" /></p>
<h2>6、订单数据入库验证补充</h2>
<ol>
<li>定义Order验证器即规则</li>
</ol>
<p><img loading="lazy" decoding="async" width="730" height="462" class="wp-image-8626" src="/wp-content/uploads/2018/06/word-image-1196.png" srcset="/wp-content/uploads/2018/06/word-image-1196.png 730w, /wp-content/uploads/2018/06/word-image-1196-300x190.png 300w" sizes="(max-width: 730px) 100vw, 730px" /></p>
<ol>
<li>写入订单数据的时候进行验证</li>
</ol>
<p><img loading="lazy" decoding="async" width="972" height="475" class="wp-image-8627" src="/wp-content/uploads/2018/06/word-image-1197.png" srcset="/wp-content/uploads/2018/06/word-image-1197.png 972w, /wp-content/uploads/2018/06/word-image-1197-300x147.png 300w, /wp-content/uploads/2018/06/word-image-1197-768x375.png 768w" sizes="(max-width: 972px) 100vw, 972px" /></p>
<h1>查看个人订单</h1>
<p><img loading="lazy" decoding="async" width="351" height="47" class="wp-image-8628" src="/wp-content/uploads/2018/06/word-image-1198.png" srcset="/wp-content/uploads/2018/06/word-image-1198.png 351w, /wp-content/uploads/2018/06/word-image-1198-300x40.png 300w" sizes="(max-width: 351px) 100vw, 351px" /></p>
<ol>
<li>修改模板（nav.html）我的订单的链接地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1159" height="276" class="wp-image-8629" src="/wp-content/uploads/2018/06/word-image-1199.png" srcset="/wp-content/uploads/2018/06/word-image-1199.png 1159w, /wp-content/uploads/2018/06/word-image-1199-300x71.png 300w, /wp-content/uploads/2018/06/word-image-1199-768x183.png 768w, /wp-content/uploads/2018/06/word-image-1199-1024x244.png 1024w" sizes="(max-width: 1159px) 100vw, 1159px" /></p>
<ol>
<li>在前台的home的order控制器，建立一个selfOrder方法，查询个人的所有订单，并分配到模板中。</li>
<li>把前台模板order.html复制到/home/view/order/目录下面，并改名为selforder.html</li>
</ol>
<p><img loading="lazy" decoding="async" width="897" height="520" class="wp-image-8630" src="/wp-content/uploads/2018/06/word-image-1200.png" srcset="/wp-content/uploads/2018/06/word-image-1200.png 897w, /wp-content/uploads/2018/06/word-image-1200-300x174.png 300w, /wp-content/uploads/2018/06/word-image-1200-768x445.png 768w" sizes="(max-width: 897px) 100vw, 897px" /></p>
<p>b、selfOrder方法</p>
<p><img loading="lazy" decoding="async" width="958" height="313" class="wp-image-8631" src="/wp-content/uploads/2018/06/word-image-1201.png" srcset="/wp-content/uploads/2018/06/word-image-1201.png 958w, /wp-content/uploads/2018/06/word-image-1201-300x98.png 300w, /wp-content/uploads/2018/06/word-image-1201-768x251.png 768w" sizes="(max-width: 958px) 100vw, 958px" /></p>
<p>我们可以把用户的付款状态和发货状态对应的文本值定义在配置文件中，这样非常方便后期状态的维护。</p>
<p><img loading="lazy" decoding="async" width="853" height="412" class="wp-image-8632" src="/wp-content/uploads/2018/06/word-image-1202.png" srcset="/wp-content/uploads/2018/06/word-image-1202.png 853w, /wp-content/uploads/2018/06/word-image-1202-300x145.png 300w, /wp-content/uploads/2018/06/word-image-1202-768x371.png 768w" sizes="(max-width: 853px) 100vw, 853px" /></p>
<ol>
<li>模板selfOrder.html遍历订单数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1248" height="464" class="wp-image-8633" src="/wp-content/uploads/2018/06/word-image-1203.png" srcset="/wp-content/uploads/2018/06/word-image-1203.png 1248w, /wp-content/uploads/2018/06/word-image-1203-300x112.png 300w, /wp-content/uploads/2018/06/word-image-1203-768x286.png 768w, /wp-content/uploads/2018/06/word-image-1203-1024x381.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="1014" height="414" class="wp-image-8634" src="/wp-content/uploads/2018/06/word-image-1204.png" srcset="/wp-content/uploads/2018/06/word-image-1204.png 1014w, /wp-content/uploads/2018/06/word-image-1204-300x122.png 300w, /wp-content/uploads/2018/06/word-image-1204-768x314.png 768w" sizes="(max-width: 1014px) 100vw, 1014px" /></p>
<h1>完成订单付款</h1>
<ol>
<li>给去付款按钮设置一个链接地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1247" height="327" class="wp-image-8635" src="/wp-content/uploads/2018/06/word-image-1205.png" srcset="/wp-content/uploads/2018/06/word-image-1205.png 1247w, /wp-content/uploads/2018/06/word-image-1205-300x79.png 300w, /wp-content/uploads/2018/06/word-image-1205-768x201.png 768w, /wp-content/uploads/2018/06/word-image-1205-1024x269.png 1024w" sizes="(max-width: 1247px) 100vw, 1247px" /></p>
<ol>
<li>在payMoney的方法中，完成付款的操作</li>
</ol>
<p><img loading="lazy" decoding="async" width="943" height="350" class="wp-image-8636" src="/wp-content/uploads/2018/06/word-image-1206.png" srcset="/wp-content/uploads/2018/06/word-image-1206.png 943w, /wp-content/uploads/2018/06/word-image-1206-300x111.png 300w, /wp-content/uploads/2018/06/word-image-1206-768x285.png 768w" sizes="(max-width: 943px) 100vw, 943px" /></p>
<p>修改支付成功的get同步回调的方法returnurl,支付成功，跳转到用户的订单列表</p>
<p><img loading="lazy" decoding="async" width="1004" height="704" class="wp-image-8637" src="/wp-content/uploads/2018/06/word-image-1207.png" srcset="/wp-content/uploads/2018/06/word-image-1207.png 1004w, /wp-content/uploads/2018/06/word-image-1207-300x210.png 300w, /wp-content/uploads/2018/06/word-image-1207-768x539.png 768w" sizes="(max-width: 1004px) 100vw, 1004px" /></p>
<h1>七、后台订单管理</h1>
<h2>1、订单列表无刷新分页</h2>
<p>分析：</p>
<p><img loading="lazy" decoding="async" width="1149" height="204" class="wp-image-8638" src="/wp-content/uploads/2018/06/word-image-1208.png" srcset="/wp-content/uploads/2018/06/word-image-1208.png 1149w, /wp-content/uploads/2018/06/word-image-1208-300x53.png 300w, /wp-content/uploads/2018/06/word-image-1208-768x136.png 768w, /wp-content/uploads/2018/06/word-image-1208-1024x182.png 1024w" sizes="(max-width: 1149px) 100vw, 1149px" /></p>
<p>无属性分页只需要发送ajax请求，只需获取需要的数据返回来进行替换即可。</p>
<ol>
<li>给分页的超练级a标签绑定单击事件，需要获取到其href属性值，并且阻止默认行为，用ajax请求地址即可，获取所需要的上面两部分数据，进行替换即可</li>
</ol>
<p><img loading="lazy" decoding="async" width="1096" height="476" class="wp-image-8639" src="/wp-content/uploads/2018/06/word-image-1209.png" srcset="/wp-content/uploads/2018/06/word-image-1209.png 1096w, /wp-content/uploads/2018/06/word-image-1209-300x130.png 300w, /wp-content/uploads/2018/06/word-image-1209-768x334.png 768w, /wp-content/uploads/2018/06/word-image-1209-1024x445.png 1024w" sizes="(max-width: 1096px) 100vw, 1096px" /></p>
<ol>
<li>为了获取独立的分页主体数据，我们可以抽离到一个html模板中</li>
</ol>
<p><img loading="lazy" decoding="async" width="821" height="436" class="wp-image-8640" src="/wp-content/uploads/2018/06/word-image-1210.png" srcset="/wp-content/uploads/2018/06/word-image-1210.png 821w, /wp-content/uploads/2018/06/word-image-1210-300x159.png 300w, /wp-content/uploads/2018/06/word-image-1210-768x408.png 768w" sizes="(max-width: 821px) 100vw, 821px" /></p>
<p>3、在index方法判断是否是ajax请求，返回所需要的数据即可。</p>
<p><img loading="lazy" decoding="async" width="1009" height="601" class="wp-image-8641" src="/wp-content/uploads/2018/06/word-image-1211.png" srcset="/wp-content/uploads/2018/06/word-image-1211.png 1009w, /wp-content/uploads/2018/06/word-image-1211-300x180.png 300w, /wp-content/uploads/2018/06/word-image-1211-768x457.png 768w" sizes="(max-width: 1009px) 100vw, 1009px" /></p>
<p>核心利用fetch方法：此方法其实做了3件事件；</p>
<ol>
<li>获取到模板内容 2.把分配到此模板中的变量进行替换 3.把替换好的模板内返回</li>
</ol>
<p>注：由于无刷新分页的页码是ajax动态返回来的，要给动态增加元素绑定事件只能是用委托方式去绑定：</p>
<p>父选择器.on(事件名,子选择器，callback)</p>
<h2>2、分配订单物流信息</h2>
<h2>3、查询订单物流信息</h2>
<h2>4、订单无刷新搜索</h2>
<h2>5、搜索关键字高亮显示</h2>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8570.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP5商城（十）订单物流信息、Ajax查询物流、订单无刷新搜索、搜索关键字高亮</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8642.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8642.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 08 Jun 2018 00:31:48 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Ajax查询物流]]></category>
		<category><![CDATA[搜索关键字高亮]]></category>
		<category><![CDATA[订单无刷新搜索]]></category>
		<category><![CDATA[订单物流信息]]></category>
		<guid isPermaLink="false">/?p=8642</guid>

					<description><![CDATA[商城第十天 分配订单物流信息 注：只有已付款、未发货的订单才可以给他设置物流。 判断已付款，未发货的订单设置配 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>商城第十天</h1>
<h1>分配订单物流信息</h1>
<p>注：只有已付款、未发货的订单才可以给他设置物流。</p>
<ol>
<li>判断已付款，未发货的订单设置配置物流的操作</li>
</ol>
<p><img loading="lazy" decoding="async" width="1300" height="481" class="wp-image-8643" src="/wp-content/uploads/2018/06/word-image-1212.png" srcset="/wp-content/uploads/2018/06/word-image-1212.png 1300w, /wp-content/uploads/2018/06/word-image-1212-300x111.png 300w, /wp-content/uploads/2018/06/word-image-1212-768x284.png 768w, /wp-content/uploads/2018/06/word-image-1212-1024x379.png 1024w" sizes="(max-width: 1300px) 100vw, 1300px" /></p>
<ol>
<li>在后台的OrderController中建立一个upd的方法，设置当前订单的物流公司和运单号，且把发货在改为已发货。</li>
</ol>
<p><img loading="lazy" decoding="async" width="1000" height="603" class="wp-image-8644" src="/wp-content/uploads/2018/06/word-image-1213.png" srcset="/wp-content/uploads/2018/06/word-image-1213.png 1000w, /wp-content/uploads/2018/06/word-image-1213-300x180.png 300w, /wp-content/uploads/2018/06/word-image-1213-768x463.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<p>定义一个Order验证器，验证编辑信息：</p>
<p><img loading="lazy" decoding="async" width="787" height="483" class="wp-image-8645" src="/wp-content/uploads/2018/06/word-image-1214.png" srcset="/wp-content/uploads/2018/06/word-image-1214.png 787w, /wp-content/uploads/2018/06/word-image-1214-300x184.png 300w, /wp-content/uploads/2018/06/word-image-1214-768x471.png 768w" sizes="(max-width: 787px) 100vw, 787px" /></p>
<ol>
<li>编辑物流的模板upd.html</li>
</ol>
<p><img loading="lazy" decoding="async" width="1252" height="658" class="wp-image-8646" src="/wp-content/uploads/2018/06/word-image-1215.png" srcset="/wp-content/uploads/2018/06/word-image-1215.png 1252w, /wp-content/uploads/2018/06/word-image-1215-300x158.png 300w, /wp-content/uploads/2018/06/word-image-1215-768x404.png 768w, /wp-content/uploads/2018/06/word-image-1215-1024x538.png 1024w" sizes="(max-width: 1252px) 100vw, 1252px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="513" height="187" class="wp-image-8647" src="/wp-content/uploads/2018/06/word-image-1216.png" srcset="/wp-content/uploads/2018/06/word-image-1216.png 513w, /wp-content/uploads/2018/06/word-image-1216-300x109.png 300w" sizes="(max-width: 513px) 100vw, 513px" /></p>
<h1>ajax查询订单物流信息</h1>
<p>注：只有订单发货了才可以查询物流信息</p>
<p>这里使用第三方的物流接口地址快递100：</p>
<p>接口地址：<a href="/goto/ckwc" rel="nofollow">http://www.kuaidi100.com/applyurl?key={$key}&amp;com={$com}&amp;nu={$nu}&amp;show=0</a></p>
<p>key秘钥:9d37bc6b0a41e6fe</p>
<p>com:物流公司</p>
<p>&lt;option value=&#8221;&gt;请选择物流公司&lt;/option&gt;</p>
<p>&lt;option value=&#8221;yuantong&#8221;&gt;圆通&lt;/option&gt;</p>
<p>&lt;option value=&#8221;shentong&#8221;&gt;申通&lt;/option&gt;</p>
<p>&lt;option value=&#8221;zhongtong&#8221;&gt;中通&lt;/option&gt;</p>
<p>&lt;option value=&#8221;yunda&#8221;&gt;韵达&lt;/option&gt;</p>
<p>&lt;option value=&#8221;shunfeng&#8221;&gt;顺丰&lt;/option&gt;</p>
<p>nu:运单号</p>
<p>show:指定接口返回的数据格式。免费版的返回的都是一样，只返回一个当前物流的url地址。</p>
<p>请求结果是返回一个物流的url地址：</p>
<p><img loading="lazy" decoding="async" width="850" height="77" class="wp-image-8648" src="/wp-content/uploads/2018/06/word-image-1217.png" srcset="/wp-content/uploads/2018/06/word-image-1217.png 850w, /wp-content/uploads/2018/06/word-image-1217-300x27.png 300w, /wp-content/uploads/2018/06/word-image-1217-768x70.png 768w" sizes="(max-width: 850px) 100vw, 850px" /></p>
<p>再去请求此返回的url地址，才会的到物流的信息</p>
<p><img loading="lazy" decoding="async" width="1012" height="295" class="wp-image-8649" src="/wp-content/uploads/2018/06/word-image-1218.png" srcset="/wp-content/uploads/2018/06/word-image-1218.png 1012w, /wp-content/uploads/2018/06/word-image-1218-300x87.png 300w, /wp-content/uploads/2018/06/word-image-1218-768x224.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></p>
<p>我们后面只需要把返回的url地址作为iframe的src属性值即可显示物流信息</p>
<p>&lt;iframe src=’http://www.kuaidi100.com/kuaidiresult?id=85728734’ /&gt;</p>
<ol>
<li>只有发货的订单才可以查询物流信息</li>
</ol>
<p><img loading="lazy" decoding="async" width="1307" height="467" class="wp-image-8650" src="/wp-content/uploads/2018/06/word-image-1219.png" srcset="/wp-content/uploads/2018/06/word-image-1219.png 1307w, /wp-content/uploads/2018/06/word-image-1219-300x107.png 300w, /wp-content/uploads/2018/06/word-image-1219-768x274.png 768w, /wp-content/uploads/2018/06/word-image-1219-1024x366.png 1024w" sizes="(max-width: 1307px) 100vw, 1307px" /></p>
<ol>
<li>在index.html模板中给class=getWuliu采用委托的方法绑定单击事件</li>
</ol>
<p><img loading="lazy" decoding="async" width="1072" height="463" class="wp-image-8651" src="/wp-content/uploads/2018/06/word-image-1220.png" srcset="/wp-content/uploads/2018/06/word-image-1220.png 1072w, /wp-content/uploads/2018/06/word-image-1220-300x130.png 300w, /wp-content/uploads/2018/06/word-image-1220-768x332.png 768w, /wp-content/uploads/2018/06/word-image-1220-1024x442.png 1024w" sizes="(max-width: 1072px) 100vw, 1072px" /></p>
<ol>
<li>在后台OrderController中建立一个queryWuliu方法，查询物流</li>
</ol>
<p><img loading="lazy" decoding="async" width="1216" height="400" class="wp-image-8652" src="/wp-content/uploads/2018/06/word-image-1221.png" srcset="/wp-content/uploads/2018/06/word-image-1221.png 1216w, /wp-content/uploads/2018/06/word-image-1221-300x99.png 300w, /wp-content/uploads/2018/06/word-image-1221-768x253.png 768w, /wp-content/uploads/2018/06/word-image-1221-1024x337.png 1024w" sizes="(max-width: 1216px) 100vw, 1216px" /></p>
<p>把物流秘钥写在config.php配置文件中，方便后期维护。</p>
<p><img loading="lazy" decoding="async" width="790" height="262" class="wp-image-8653" src="/wp-content/uploads/2018/06/word-image-1222.png" srcset="/wp-content/uploads/2018/06/word-image-1222.png 790w, /wp-content/uploads/2018/06/word-image-1222-300x99.png 300w, /wp-content/uploads/2018/06/word-image-1222-768x255.png 768w" sizes="(max-width: 790px) 100vw, 790px" /></p>
<ol>
<li>把接口的返回的url地址作为iframe的src属性即可（采用layer弹出实现）</li>
</ol>
<p><img loading="lazy" decoding="async" width="1001" height="530" class="wp-image-8654" src="/wp-content/uploads/2018/06/word-image-1223.png" srcset="/wp-content/uploads/2018/06/word-image-1223.png 1001w, /wp-content/uploads/2018/06/word-image-1223-300x159.png 300w, /wp-content/uploads/2018/06/word-image-1223-768x407.png 768w" sizes="(max-width: 1001px) 100vw, 1001px" /></p>
<p>注：要引入layer弹出层插件</p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="1130" height="346" class="wp-image-8655" src="/wp-content/uploads/2018/06/word-image-1224.png" srcset="/wp-content/uploads/2018/06/word-image-1224.png 1130w, /wp-content/uploads/2018/06/word-image-1224-300x92.png 300w, /wp-content/uploads/2018/06/word-image-1224-768x235.png 768w, /wp-content/uploads/2018/06/word-image-1224-1024x314.png 1024w" sizes="(max-width: 1130px) 100vw, 1130px" /></p>
<h1>订单无刷新搜索，搜索关键字高亮显示</h1>
<ol>
<li>在订单列表中模板index.html中，设置搜索的表单区域</li>
</ol>
<p><img loading="lazy" decoding="async" width="1220" height="290" class="wp-image-8656" src="/wp-content/uploads/2018/06/word-image-1225.png" srcset="/wp-content/uploads/2018/06/word-image-1225.png 1220w, /wp-content/uploads/2018/06/word-image-1225-300x71.png 300w, /wp-content/uploads/2018/06/word-image-1225-768x183.png 768w, /wp-content/uploads/2018/06/word-image-1225-1024x243.png 1024w" sizes="(max-width: 1220px) 100vw, 1220px" /></p>
<ol>
<li>给上面表单内id=serach按钮绑定单击事件，发送ajax请求，进行关键字查询</li>
</ol>
<p><img loading="lazy" decoding="async" width="1044" height="311" class="wp-image-8657" src="/wp-content/uploads/2018/06/word-image-1226.png" srcset="/wp-content/uploads/2018/06/word-image-1226.png 1044w, /wp-content/uploads/2018/06/word-image-1226-300x89.png 300w, /wp-content/uploads/2018/06/word-image-1226-768x229.png 768w, /wp-content/uploads/2018/06/word-image-1226-1024x305.png 1024w" sizes="(max-width: 1044px) 100vw, 1044px" /></p>
<ol>
<li>在OrderController控制器的index方法中拼接where查询条件：</li>
</ol>
<p><img loading="lazy" decoding="async" width="1215" height="675" class="wp-image-8658" src="/wp-content/uploads/2018/06/word-image-1227.png" srcset="/wp-content/uploads/2018/06/word-image-1227.png 1215w, /wp-content/uploads/2018/06/word-image-1227-300x167.png 300w, /wp-content/uploads/2018/06/word-image-1227-768x427.png 768w, /wp-content/uploads/2018/06/word-image-1227-1024x569.png 1024w" sizes="(max-width: 1215px) 100vw, 1215px" /></p>
<ol>
<li>为了将查询关键字高亮显示，我们可以用正则进行全局替换</li>
</ol>
<p><img loading="lazy" decoding="async" width="1251" height="454" class="wp-image-8659" src="/wp-content/uploads/2018/06/word-image-1228.png" srcset="/wp-content/uploads/2018/06/word-image-1228.png 1251w, /wp-content/uploads/2018/06/word-image-1228-300x109.png 300w, /wp-content/uploads/2018/06/word-image-1228-768x279.png 768w, /wp-content/uploads/2018/06/word-image-1228-1024x372.png 1024w" sizes="(max-width: 1251px) 100vw, 1251px" /></p>
<p>其中无刷新分页的时候，也同样要进行替换：</p>
<p><img loading="lazy" decoding="async" width="1234" height="523" class="wp-image-8660" src="/wp-content/uploads/2018/06/word-image-1229.png" srcset="/wp-content/uploads/2018/06/word-image-1229.png 1234w, /wp-content/uploads/2018/06/word-image-1229-300x127.png 300w, /wp-content/uploads/2018/06/word-image-1229-768x325.png 768w, /wp-content/uploads/2018/06/word-image-1229-1024x434.png 1024w" sizes="(max-width: 1234px) 100vw, 1234px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="905" height="268" class="wp-image-8661" src="/wp-content/uploads/2018/06/word-image-1230.png" srcset="/wp-content/uploads/2018/06/word-image-1230.png 905w, /wp-content/uploads/2018/06/word-image-1230-300x89.png 300w, /wp-content/uploads/2018/06/word-image-1230-768x227.png 768w" sizes="(max-width: 905px) 100vw, 905px" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8642.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
