商城第六天
一、邮件技术实现密码找回
1、邮件发送概述
(1)邮件发送的原理
解释:
POP3:全名为“Post Office Protocol – Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件,提供了SSL加密。
简单一句话,POP服务器是用来收信的。
(2)SMTP协议(Simple Mail Transfer Protocol)
SMTP(Simple Mail Transfer Protocol):
即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。
通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
简单的说: SMTP则是负责邮件服务器与邮件服务器之间的寄信的通讯协定(类似于http协议)
2、如何实现邮件的发送
(1)需要有邮件发送的第三方程序包,比如可以使用开源免费的PHPMailer
(2)需要邮件服务器
利用互联网上的第三方免费邮件服务器,例如 163, qq等,有些大公司会自己搭建邮件服务器。
(3)需要在免费的邮件服务器里面(可以去注册163的),注册一个邮箱,进入邮箱后,要开通smtp服务。
以163为例,先注册一个邮箱账号。
注册成功然后登录进入用户设置
开通smtp服务
设置客户端授权密码
(4) php.ini配置文件中需要启用sockets扩展。
记得重启apache服务器
3、邮件发送案例
参考以下示例:
集成到项目中实现忘记密码功能
- 把上面测试通过的发送邮件的sendEmail复制到[应用目录]/extend目录中
注:测试的时候,记得修改demo.php中的基本配置。
- 在common.php文件中封装一个发送邮件的方法sendEmail
- 记得测试一下是否ok
实现登录的忘记密码功能
找回密码的基本流程图解:
- 修改登录页面的忘记密码的链接地址
- 在home-publicController-findpassword方法,展示一个输入注册时候的邮箱的模板显示。
注:模板可以直接复制登录的login.html模板即可,稍做修改
效果:
- 给上面的按钮绑定单击事件,进行发送ajax,触发发送邮件。
- 在home模块的PublicController控制器中的findPassword方法中判断是否是ajax请求,接收重置的邮箱,进行一些发送邮件前的判断
- 当输入的邮箱在系统中存在的时候,就进行发送邮件。
需要把修改密码的链接地址构造起来一个a标签,发送给邮箱的用户:
类似于: php15商城– <a href=”http://域名/修改密码的新地址”>点我找回密码</a>
获取当前网站的请求协议和域名:
发送成功或失败,在html静态页面给出对应的提示:
注:上面提示layer.msg需要引入layer弹出层插件
邮件收到的地址如下:
- 建立一个修改密码的方法updpassword。
模板内容如下:
- 给上面的id=updPassword绑定单击事件,发送ajax请求,修改密码
注:上面模板也要引入layer弹出层插件
- 在updpassword中判断是否是ajax请求,完成修改用户的密码
同时在Memer模型的编辑的前钩子中完成密码的加密:
验证邮件地址的合法性
- 因为用户可以篡改邮件的链接地址,如把id=1的用户改为id=3的用于,这样就把其他用户的密码给修改了
- 还要保证链接地址有个有效期比如1天。
具体做法:
- 在发送邮件的时候,给携带携带3个参数,member_id、time、加密的字符串。
加密的字符串是member_id和time和我们配置中一个配置项加密的结果。
邮件地址生成的a链接地址如下:
- 在更新密码的updPassword方法中,判断邮件地址是否被篡改,且要在指定的有效期内
以后凡是防止用户篡改表单或者url中的参数,解决办法:加密后对比处理。
二、QQ互联
1、注册QQ互联应用
先去腾讯开发平台注册账号:http://open.qq.com/ 。
等资料审核通过后便可去qq互联创建应用: https://connect.qq.com/manage.html#/ ,创建好如下所示。
点击上面的查看,进入以下页面:
回调域设置:
注意:
- 上面的应用虽然审核不通过,但是不影响我们使用。我们只需要获取应用的appid和key即可。
- 只有网站备案通过,应用才可以审核通过,没通过审核的应用只能使用我们所注册的qq号进行登录测试,审核通过后就没限制。
- 当我们本地网站集成qq登录时,本地域名回调地址域需要和上面应用设置的一样。
注意:
当应用创建好之后,立刻记住appid和appkey ,设置好和我们本地网站域名一样的回调域和回调地址。
2、下载QQ登录PHP-SDK 集成包
下载地址:http://wiki.connect.qq.com/
下载php版本:
下载下来如下所示:
进行QQ登录前的参数配置
1、把qq登录开发包SDK中的以下目录复制到网站根目录下,即[应用目录]/public/中
- 直接在浏览器中访问connect2.1目录中即可
点击上面的设置配置项。
进入如下:
点击上面的example,,点击qq登录登录的logo图标,如果能够有一个qq登录的弹框说明配置成功
注意:我们应用中的域名如果备案审核通过,则只能用我们所注册的qq进行登录测试
用注册的qq登录成功之后,会进入到我们之前所设置的callback回调地址
分析如何唤起QQ登录弹框
分析qq图标的logo按钮
再去对应的文件中查看toQzoneLogin()事件:
可见事件在一个新窗口打开oauth 中的index.php。找到此文件
可见,以上3行代码最终唤起qq登录弹框!。后面在项目中,点击qq登录的logo图标执行这三行代码即可完成qq登录弹框。
5、集成到项目中实现QQ登录
qq登录流程图:
1、点击qq登录的图片,唤起qq登录弹框
- 把之前测好的API目录复制到extend/qqLogin/目录下面
注:如果之前的配置参数写错了,可以直接修改inc.php文件
- 在login.html的登录模板给qq的登录图标,设置一个url地址,跳到home-memberController-qqLogin方法:
qqLogin方法如下:
点击下面的qq登录,出现qq弹框说明引入项目成功:
在qq回调域callback中获取openid和token
- 在home模块member控制器中建立一个qq回调方法名为qqCallback
获取到openid和token和qq用户相关的信息如下:
实现qq完成系统的登录
在前台会员表sh_member中加一个字段nickname在,记录用户登录成功的昵称。
1、先去系统中判断有没有此qq的openid 。做不同的业务逻辑
代码如下:
注:需要在member模型的入库的前钩子中,对密码加密进行判断,因为qq登录没有密码
登录成功效果:
三、完成分类列表页的面包屑导航
如下:
面包屑导航就是找当前分类的父分类。
核心:
找子分类:传递当前分类的cat_id,进行递归查找。
找父分类:传递当前分类的pid,进行递归查找。
代码
- 设置好首页的分类的链接地址:以三级分类筛选地址为例:
- 在home-CategoryController-index方法,取出当前分类的面包屑导航相关数据,并分配到模板中
同时在home模块的Category模型中定义一个getFamilyCats的方法,获取父分类
- 模板中遍历数据
模板复制前台模板的list.html到 /home/view/category/目录下,并改名为index.html
遍历数据:
效果:
四、实现分类列表页左侧分类菜单
分析
思路:
不管点击哪一个分类到此分类列表页,下图的蓝色区域都是当前分类的最顶级分类。
蓝色顶级分类下面含有二级分类,二级分类下又包含三级分类。
如下:
顶级分类:电脑办公
二级分类:电脑整机、电脑配件、办公打印等
三级分类:如电脑整机下有笔记本、超极本、平板电脑
代码实现
- 在index方法中取出所有的分类,以cat_id 为二维数组下标,把每个元素通过pid进行分组
- 模板中遍历数据
效果:
五、完成分类列表页商品的展示
分析
当点击某个分类的时候,应该把当前分类及其子孙分类下面的所有商品取出来。
如:当点击华为手机分类的时候,应该把华为分类下面的所有的商品取出来。
如:当点击国内手机分类时,应该把国内手机分类下面的所有的子孙分类的商品都取出来
代码实现
1、在home-categoryController-index方法中,取出当前分类及其子孙分类所有的商品
2、模板中遍历
效果:
六、完成商品详情页
1、实现商品详情页面包屑导航
2、商品基本数据的展示
3、实现商品详情页中的图片画廊的展示
4、实现商品详情页属性的展示
分析
单选属性:
注意一点:
因为单选属性的值可能有多个,所以我们可以把根据属性的attr_id进行分组,把相同属性的attr_id的值归为同一组,方便在模板中进行循环遍历。
唯一属性:
唯一属性不需要分组,因为唯一属性的值只有一个。
代码实现
5、实现商品详情页的浏览历史
分析
基本思路:
①可以使用cookie技术来实现浏览商品历史的存储,cookie中存储商品的goods_id即可。
只所以只存储浏览商品的id,因为商品的价格后面可能随时会变化,且记录一般存储3-5个。
②最新访问的商品应该放置在浏览历史的第一个位置
③当浏览历史存储量到达最大值(如超过5),应把最早访问的商品id给移除。
④当访问相同商品的时候,只保留最后访问的商品,即数组需要删除重复的元素。
cookie怎么存储所访问商品的id: 我们把访问商品的id存进数组中,再把数组写入到cookie中,形式如:[1,4,6,2,8]。
代码实现