商城实战第一天
电商介绍
电子商务模式介绍
现在的电子商务平台主要分为以下几种类型:
- B2C :全称-Business to Consumer , 即企业与消费者之间的电子商务。
常见的有B2C网站有:天猫(商家入驻(实体店,保证金20W),需要营业许可证等资料)、京东(商家也可入驻)、当当网、唯品会、凡客、小米、华为、oppo等
- C2C: 全称-Consumer to Consumer,即消费者与消费者之间的电子商务。
典型的C2C网站就是国内的淘宝(需要交保证金2000元左右),还有58同城,二手交易网站如:闲鱼二手交易网。
- O2O: 全称-Online to Offline,线上与线下相结合的电子商务。
常见的有:苏宁、美团、国美、滴滴打车等。
- B2B:全称-Business to Business 即企业与企业之间的电子商务。(阿里妈妈)
常见的开源商城
(1)Ecshop
ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。
特点:开源、免费(个人学习使用没有任何问题)。但是企业使用用来盈利的话需要一定的授权费用(3000元左右)。
(2)shopex
特点:商业版,代码是加密过的。
(3)shopnc
演示地址: http://b2b2c.shopnctest.com/dema/shop/index.php
特点:不开源、不免费
小结:
开源不代表免费,可以自己学习研究使用,但是以盈利为目的使用需要交一定的授权费用。
安装Ecshop开源商城
现在的Ecshop主要有以下两个版本:
- 3.0版本:需要php5.4版本以上
- 2.7版本:需要在php5.3以下(如:phpstudy集成环境进行php降级),当然5.4、5、5版本也是可以的,只是需要修改部分代码。
这里建议安装Ecshop的兼容版本,已经兼容各个php版本。
域名部署访问 ecshop
一般把第三方开源项目部署在自己的机子上面域名前建议加个vendor,如:vendor.shop.com。明确知道这个程序是第三方程序。本地自己开发的项目话建议使用local进行开头,如:local.shop.com。
步骤1:把ecshop开源程序的所有的文件复制到我们的项目目录
步骤2:配置虚拟主机,如域名为上面的vendor.ecshop.com
- phpstudy设置虚拟主机
- 设置host文件映射
- 重启phpstudy
步骤3:输入域名进行安装配置
- 勾选
b、配置系统
c、配置数据库的信息
访问ecshop前台:http:/域名/
访问ecshop后台:http:/域名/admin/
部署tp5商城项目环境
部署虚拟主机
三步:
步骤1:把tp5项目程序复制指定虚拟目录
步骤2:使用phpstudy配置域名如为:www.php15shop.com,虚拟目录需要绑定到public目录下面
步骤3:设置hosts文件映射
最后访问如下,说明配置成功:
导入商城项目所有数据表
建议使用navicat可视化工具进行完成,找到对应的sql文件,进行导入。
要先创建一个数据库,如php15shop
每张表的字段信息可以参考数据库文档:
项目前的一些配置
我们可以先把数据库、控制器后缀、静态资源目录等一些基本配置先定义好。
- 数据库配置
- 控制器后缀
- 配置静态资源路径,把后台静态资源放到相应的目录,配置后台密码加密验salt
- 先设置默认模块为admin、开发前台时(项目上线)设置为home
- 并且开启调试模式,页面trace调试,看到错误的详细信息
开启页面trace调试,页面右下角多处一个图标。
- 开启模型获取数据返回关联数组的配置
- 修改重写文件.htaccess隐藏单一入口文件访问
这里需要在httpd.conf开启rewrite重写模块,和在虚拟主机中把 AllowOverride None改为 AllowOverride All,这两步在安装phpstudy的时候和配置虚拟主机时其已经帮我们设置好了。
只需要改修改重写文件.htaccess,前面加个问号?
三、搭建后台首页
步骤1:在后台admin建立一个index控制器,分别建立top、main、left、index
步骤2:复制后台指定的模板到指定的目录,并且修改每个模板的静态资源路径
访问效果:
四、用户表的CURD操作
完成用户的添加功能
步骤1:在后台创建User控制器,并建立一个add方法输出模板内容
步骤2:修改add.html模板的name名称
步骤3:定义当前表的验证器
步骤4:在模型中定义前入库的钩子事件,完成密码字段的加密
步骤5:控制器完成验证入库操作
完成用户列表功能及分页
步骤1:在后台User控制器建立一个index方法,取出所有的用户数据,并分配到模板中
步骤2:模板遍历数据
效果:
完成用户的编辑功能
编辑用户的时候,密码选项需要考虑两种情况:
①如密码和确认密码都为空,说明用户不想修改密码,则保留原来的密码。
②如果两个密码有一个不为空,说明用户想修改密码,则必须要求用户两次密码一致。
代码如下:
步骤1:给编辑的设置一个链接地址,携带一个主键值
步骤2:使用jquery-validate对密码字段进行验证
规则如下:
注:要修改style.css文件样式,因为有样式冲突
设置upd.html模板内容回显数据:
步骤3:upd方法中完成编辑的验证编辑入库
同时修改编辑场景的验证器:
ajax控制用户的登录状态
步骤1:先给标签加一个a标签,并且阻止默认行为,同时加一个is_active和user_id属性,目的是获取当前记录的状态值和主键值,并且绑定类名为changeActive。
步骤2:给class=changeActive 绑定单击事件,发送ajax请求
步骤3:在User控制器建立一个ajaxChangeActive方法,完成状态的更改
注意:由于更改状态值的时候会触发编辑的前钩子,这时候没有携带密码字段前钩子会直接报错,解决办法:对前钩子有没有密码字段进行isset判断即可:
提示:调试ajax的时候,务必要打开控制器network进行调试。可以打开response选项看报啥错,这样可以快速定位到错误的原因。
五、完成后台用户登录|退出|防翻墙功能
完成后台登录功能
步骤1:在后台建立一个Public控制器,并建立一个login方法,输出登录模板同时,同时完成登录的功能实现
同时在User模型中,定义一个checkUser的方法,检测用户名和密码是否相等
步骤2:修改login.html模板内容,显示验证码
步骤3:在验证器中定义登录场景的验证规则
登录成功,在top.html中回显用户名
完成后台退出功能
步骤1:在后台Public控制器建立一个logout的退出方法
防用户翻墙
防翻墙思想:建立一个父控制器如:CommonController,在此控制器的构造函数中做session的判断,其他需要进行验证session的控制器就继承此公共控制器即可防止翻墙,某些控制器不需要session判断则不继承即可。(如:PublicController)
其中Index 和User控制器需要继承Common,public不需要继承
六、RBAC权限控制
RBAC介绍
RBAC: Role Based Access Controller ,即基于角色的访问权限控制。
简单的说,用户登录可以属于不同的角色,不同的角色拥有的后台访问菜单权限也不一样。
如:
如下面的每个菜单就是一个权限。
后台菜单中权限一般只控制到两级权限,权限级别太深难以维护,具体要看项目需求。
一级权限:如:商品管理。
二级权限:如:商品添加、商品列表。
三级权限:如:商品列表中的编辑或删除操作
RBAC表的表设计
一般RBAC权限控制都3张表和5张表,其核心都是一样。
3张表:后台用户表、角色表、权限表。
而5张表仅把用户表和角色表、角色表和权限表其相关联的字段分别使用一个表来维护。且表多了维护起来更加繁琐。
这里我们采用3张表来做权限控制。
三张表的关系如下:
分析:
- 用户表通过角色字段role_id,找到与其关联的角色表role_id。
- 角色表通过所拥有的所有权限字段auth_id_list,找到与其关联的权限表的auth_id。
控制权限图解:
可见,一个用户对应着一个角色,一个角色可以拥有多个权限。
七、RBAC功能实现
权限表的curd操作
(1)完成权限的添加
步骤1:在后台建立一个Auth控制器,并建立一个add方法,输出模板内容,并完成添加权限的实现
同时在Auth模型中取出权限的无限级分类数据:
步骤2:设置add.html模板内容
当选择顶级权限时,控制器名和方法名不可用,否则可用。因为顶级权限没有控制器名和方法名。
注意:表单input设置disabled和readonly的区别
相同点:都不可以编辑input中的数据
不同点:设置disabled时,php中通过$_POST接收不到input框name的属性值
设置readonly时,php中通过$_POST可以收到input的name的属性值
步骤3:定义Auth验证器,进行验证
模板效果:
完成权限的列表展示
完成权限的编辑
完成权限的删除
角色表的curd操作
添加角色及分配权限
注:一般系统角色名为超级管理员都会拥有所有的权限,其权限字段auth_id_list可以手动设置为*。
(2)角色的列表展示
把一个角色所拥有的权限都查出来,这里需要利用到两个mysql函数:
FIND_IN_SET和group_concat(字段)
- FIND_IN_SET(str,strlist) :
作用:查询出子串str,是否在由逗号分隔的目标字符串strlist中存在。
如:判断5是否在字符串1,2,3,4,5中存在:FIND_IN_SET(5,‘1,2,3,4,5’) ,存在则返回所在目标字符串strlist的所在位置,不存在则返回0。
- group_concat(字段)
作用:主要根据某个字段进行分组,把相同字段的值连接在一起。
默认连接符号是逗号 ,如果用|连接则:
group_concat(字段名 SEPARATOR “|”)
例:如下是表tp_article表中的一些数据
根据cat_id字段进行分组,把具有相同cat_id的title字段值连接在一起。