此文章为自己书写,在Word上做的笔记,然后拷贝到这上边的,无任何抄袭。另外若是程序有任何问题可以评论,也可私信我。
若是想看整个学习笔记代码和数据库可点击此处(包含个人书写的项目代码及数据库文件)。
项目结构规划
对于一般的web而言,都会分为前台和后台两个部分,从表面来看,前后台是两个不同的网站。但是他们之间又有某种联系,它就是数据。
要完成一个完整的项目,就得设计好前后台的结构。
CI是基于MVC的框架,前后台C和V肯定是不同的,而M是可以共用的,包括其他的一些类和辅助函数也是可以共用的。
默认情况下,一个application对应的就是一个应用,如果需要前台和后台两个应用,怎么办呢?
解决方案:
解决办法1:最简单的办法就是直接再复制一份application,更改文件夹名称,比如admin,同时再编写一个作为入口文件。
优点:简单
缺点:重复的代码太多
解决办法2:利用CI框架的控制器和视图都可以支持子文件夹的功能。
这个类似与TP的分组功能。
解决方案3:通常对于一个项目有这么一个要求,就是前后网站的换肤功能。需要将前台的视图单独拿出来处理。
控制器通过文件子文件夹分离,前台controller放到根目录下,而后台放到admin文件夹中。视图文件则分离,前台的放到网站根目录下的themes文件夹中,且还支持子文件夹,后台则使用默认的views文件夹。
要实现这一点,我们需要对核心库进行扩展。CI默认视图必须放在views文件夹中,子文件夹默认只支持一层。
对核心类进行扩展
要完成一些特定的功能,通常有三种方式:
自己编写类文件
扩展核心类文件(建议)
替换核心类文件(不建议 )
扩展核心类文件
扩展的类必须声明由父类扩展而来
新扩展的类的文件名称必须以MY_为前缀
文件放在application/core下
步骤:
第一步,在网站根目录下创建themes文件夹(背景目录)和default以及其他需要的目录(比如holiady)
第二步,定义一个常量,在config/,如下
第三步,视图的加载由Loader类加载完成,如下
扩展Loader类。
在哪里调用这两个方法呢?前台需要开启皮肤功能,,而后台不需要,所以我们要再次扩展控制器类。分为前后台各自有一个父控制器。
扩展控制器类
总之:控制器与视图都实现前后台的分离。
商城数据库分析和设计
对一个商城而言,有用户、商品和订单。
数据库设计的一些思想和方法
关于商品品牌、分类、属性是如何表示的?是用一个字段,还是另外设计一张表?
品牌和商品是一种信息还是两种信息?
一张表只保存一种信息。
品牌和商品能否独立分开,二者的生命周期是否是一致的。
从商品入手,实体与实体之间的关系(表与表之间的关系)
一对一
一对多
多对多
对于分类表,如何表示分类的层级关系?
方案一:使用path字段,用—分割各个等级
方案二:使用pid,自引用
商品的属性信息如何保存?
商品和属性是两个独立的信息,所以应该分开来存储,设计一张专门用来保存属性的表attribute表。
商品和属性之间的关系:多对多的关系。
对于属性而言,记录太多,不好管理,需要将其进行分类管理。
商城后台部署
1.新建cishop项目目录。
2.配置数据库文件
保证创建好数据库。
3.其他的一些基本的配置
配置base_url
4.扩展Loader类和controller类进行前后台页面分离
首先配置前台页面目录路径。
在项目项目根目录下创建themes文件夹,用于保存前台的视图文件,然后在此目录下可以分为不同的主题。
在中配置常量。
第二步书写扩展loader类。
第三步书写扩展controller类。
5.后台首页控制器
然后在视图文件中,对相应的src属性做了一个更改,此处用到了URL辅助函数,所以要确保该函数已经载入。
不载入URL辅助函数报此错误。
在config下的进行配置。
所有的images,js,css等,都使用URL辅助函数,来生成对应的路径。
后台权限验证(主要学习验证码和登录及表单验证)
创建权限管理控制器,注意,由于此控制器是不需要权限就可以访问的,所以继承自CI_Controller。
验证码
创建验证码的两种方式
使用CI提供的create_captcha方法产生验证码
关于验证码,CI提供了一个辅助函数CAPTCHA。
如何使用CI提供的辅助函数CAPTCHA?
首先要载入函数
使用create_captcha得到验证码
在所有的参数中,有两个参数是必须要设置的,img_url,img_path
创建用来缓存验证码图片的文件夹。
调用create_captcha方法产生验证码图片信息,并将数据传到文件中
在视图界面中,将得到的数据直接输出
问题A:CI提供的capacha生成的这么多验证码图片,如何清理过期的验证码图片?
create_captcha在生成验证码的同时,会自动检查是否有过期的验证码图片,如果有则删除之。通过expiration属性关键字设置过期时间。
问题B:captcha默认生成8个字符组成的字符串的验证码,有无办法设置其输出的字符?
比如生成四个数字:
问题C: 我们需要点击验证码则刷新验证码,需要怎么做?
一般而言,对验证码只需要用一次就行,所以没有必要生成图片文件,直接输出即可。然后将其作为img标签的src属性。
扩展helpers产生自己需求的验证码MY_captcha_helper.php
在原来的基础上对captcha进行扩展,对captcha进行一个扩展,即对helpers的一个扩展。
复制system/helpers下面的captcha_helper.php到application/helpers下并添加前缀生成MY_captcha_helper.php文件。
CI的captcha函数,是生成图片,然后将其保存到指定的目录。
现在只需要输出图片即可。
现在做如下修改:1.将与目录相关的代码注释2.将上述关键性的生成验证码图片的代码注释3.自己动手创建验证码图片。操作如下:
第一步:
同时删除文件中任何与img_path和img_url有关的的信息。
第二步:
第三步:
同时添加word_length参数为4
最后在视图文件中应用:
改造完毕。
将验证码保存到Session中去
要将验证码保存到session中去,则必须要使用session了,ci中提供了一个session类
加载session类。
使用session,将验证码的字符保存下来。
在使用session时,如果出现如下错误:
则需要在中配置。
输入类
C提供了一个强大的输入类input类,这个类是自动载入的,不需要加载。
好处:方便,安全(千万不要相信用户输入的数据)。
登录验证
// 处理登录
public function signin()
{
// 获取表单数据
$captcha = strtolower($this->input->post('captcha',true));
// 获取session当中保存的验证码
$code = strtolower($this->session->userdata('code'));
if ($captcha === $code) {
#验证码正确,需要验证用户名和密码,加第二个参数true表示进行XSS(跨站脚本攻击)验证
$username = $this->input->post('username',true);
$password = $this->input->post('password',true);
if($username=='admin'&&$password=='123'){
#将用户信息保存到session中,然后跳转到首页
$this->session->set_userdata('admin',$username);
redirect('admin/main/index');
}else{
$data['url']=site_url('admin/privilege/login');
$data['wait'] = 3;
$data['messgae'] = '用户名或者密码错误,请重新填写';
$this->load->view('',$data);
}
} else {
#验证码验证失败,给出相应提示,然后返回
$data['url'] = site_url('admin/privilege/login');
$data['wait'] = 3;
$data['message'] = '验证码错误,请重新填写';
$this->load->view('',$data);
}
}
退出登录的方法
退出登录
public function logout(){
$this->session->unset_userdata('admin');
$this->session->sess_destroy();
redirect('admin/privilege/login');
}
关于表单验证明天再学。