
电子商务源于英文Electronic Commerce,简称EC,是利用简单、快捷、低成本的电子通信方式,在互联网上开展的各种商贸活动。
近年来,随着信息技术的不断发展,电子商务已关系到经济结构、产业升级和国家整体经济竞争力,利用电子商务平台出售或购买商品,更是在日常生活中随处可见。
本系列文章介绍一个简单的电子商务系统项目开发过程,帮助进一步熟悉PHP Web应用开发的框架技术。
在Web应用项目中,由于数据表之间的相互关联,常常不能或不方便使用数据库管理工具直接向数据表中插入测试数据,需要通过代码来完成相应的操作。所以,在通常情况下,Web应用项目的开发都是从后台管理系统功能模块的开发开始的。
由于本教材是PHP Web项目开发学习用基础教程,并且为读者提供了完整的数据库测试数据,所以,本案例项目的开发从前台模块的功能实现开始。
前台模块内容请查看上一篇内容。
后台功能模块设计
系统后台功能的实现与前台基本相似,下面以后台首页和商品信息管理模块为例,简单介绍系统后台功能的实现方法。
1
●
后台首页设计
后台首页承载并显示系统后台所包含的功能模块,使管理员能够清楚其管理权限。根据本项目的需求分析,确定系统后台应包括下面4个功能模块。
(1) 商品信息管理模块。该模块主要包括商品信息的添加、修改、删除和商品类别的添加等功能。
(2) 用户信息管理模块。该模块主要包括查询和显示用户注册信息、冻结用户、用户留言管理、更改管理员密码等功能。
(3) 订单信息管理模块。该模块主要包括查看所有用户提交的订单信息,并根据执行阶段对订单进行标记处理、删除订单和查询订单等功能。
(4) 公告信息管理模块。该模块主要包括系统公告信息的添加、修改、删除和用户评论信息的查看和删除等功能。
这些功能模块在后台主页界面中的链接如图9.5所示。下面简单介绍模块功能的实现。

■ 图9.5 系统后台首页
1. 控制器设计
在项目的application\controller目录中新建admin文件夹,并在该文件夹中创建Main控制器,代码如下。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* 后台首页控制器
* @author weiwenping
*/
class Main extends WM_Controller
{
public function __construct()
{
parent::__construct();
}
}
该控制器继承于自定义的控制器基类WM_Controller。在Main控制器中添加index()方法,代码如下。
public function index() {
//主内容区显示订单信息
$pagesize = 6; //每页显示的信息条数
$current = isset($_GET['page']) ? (int)$_GET['page'] : 1; //当前页
// 加载订单表模型
$this->load->model('order');
// 获取记录总条数
$total = $this->order->getNums();
// 获取当前页记录
$data['orders'] = $this->order->getDataLimit($pagesize, ($current-1)*$pagesize);
// 生成分页链接
$this->load->library('page',array('total'=>$total,'pagesize'=>$pagesize,'current'=>$current));
$data['links'] = $this->page->showPage();
// 主内容区标题
$data['content_title'] = '用户订单信息管理';
// 加载视图
$this->load->view('admin/main/index', $data);
}
对于电子商务系统的后台管理者,用户订单信息的管理是最重要的。所以,本项目的后台首页上显示的是“用户订单信息”,如图9.5所示。
在上述index()方法代码中,使用了模型类Order中的一些方法,来获取用户订单信息数据。下面创建Order模型类,并编写方法。
2. 模型设计
在项目的application\models目录中新建Order模型类,该类对应于项目的订单数据表wm_order,代码如下。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* wm_order表模型
* @author weiwenping
*/
class Order extends WM_Model
{
public function __construct() {
$this->table = 'order'; // 设置数据表
parent::__construct();
}
}
从上述代码中可以看出,该类继承于自定义模型基类WM_Model。我们在Main控制器的index()方法中使用的模型方法getNums()和getDataLimit()均继承于该模型基类。两个方法的代码如下。
/**
* 获取数据表记录总条数
* @return array
*/
public function getNums() {
return $this->db->count_all($this->table);;
}
/**
* 获取一定数量的记录
* @param int $n
* @return array
*/
public function getDataLimit($n, $offset=0){
$res = $this->db->limit($n, $offset)->get($this->table);
return $res->result_array();
}
3. 视图设计
在项目的application\views目录中新建admin\main文件夹,并编写视图文件index.php代码。详情请参见源码。
视图中的翻页功能由自定义类Page的实例化对象来实现,该类代码比较简单,请参见源码。关于自定义类的加载和使用方法,已在 9.2.4节 中做了介绍,这里不再赘述。
4. 辅助函数设计
在如图9.5所示的页面中,其头部的中间区域显示了当前的日期和时间信息,其中的“星期”显示使用了自定义的辅助函数week2zh(),将数字的星期转换为大写的中文,以符合人们日常阅读习惯。
视图中的日期显示代码如下。
<ul class="layui-nav layui-layout-left">
<li class="layui-nav-item"> 今天是: <?php echo date(' Y 年 m 月 d 日') ?></li>
<li class="layui-nav-item"> 星期 <?php echo week2zh(date('w')); ?></li>
<li class="layui-nav-item"> 现在时间: <?php echo date('H : i : s'); ?></li>
</ul>
辅助函数week2zh()代码如下。
/**
* 将小写的星期数字转换成中文大写数字
* @param string $param
*/
function week2zh($week) {
$arr = array('日','一','二','三','四','五','六');
return $arr[$week];
}
另外,为了保证项目的数据安全,后台管理系统的所有资源不允许未登录用户访问。在Main控制器的构造方法中添加访问控制的代码。
// 判断用户是否登录,若未登录则跳转到管理员登录页面
if (!$this->session->userdata('logged_in')){
redirect('admin/login_admin');
exit();
}
代码中的logged_in参数为用户的登录信息。这里使用了CI框架的session库,需要在系统的自动加载配置文件autoload.php中进行配置。
$autoload['libraries'] = array('database', 'session');
2
●
商品信息管理
商品信息管理,一般包括商品信息的增、删、改、查等相关操作。
1. 商品信息的显示
商品信息的显示与上述系统后台首页中订单的显示相似,只不过此时操作的是商品信息表wm_goods中的数据。页面效果如图9.20所示。

■ 图9.20商品信息显示页面
商品信息管理功能由控制器admin\goods_admin实现,模型为Goods,视图文件夹为views\admin\goods。
如图9.20所示页面由左侧菜单“商品管理”|“修改商品”激活,该菜单调用goods_admin控制器的index方法。详细代码请参见源码。
图9.20展示的是全部商品信息列表,单击页面中的“详情”按钮,则显示商品的详细信息,如图9.21所示。

■ 图9.21商品信息详情页面
商品信息详情的输出由admin\goods_admin控制器的detail()方法实现,代码如下。
public function detail(){
// 获取商品ID
$id = (int)$this->input->get('id',true);
// 获取商品详情
$this->load->model('goods');
$goods = $this->goods->getDataByID($id);
$this->load->vars('goods', $goods);
$this->load->vars('content_title', '商品信息详情');
$this->load->view('admin/goods/detail');
}
在上述代码中,模型方法getDataByID根据商品ID获取信息。该方法在模型基类WM_Model中定义,代码如下。
/**
* 根据商品ID查询
* @param unknown $id
* @return array
*/
public function getDataByID($id) {
$res = $this->db->where('id', $id)->get($this->table);
return $res->result_array();
}
商品信息详情的视图页面代码比较简单,请参见源码。
2. 商品信息的添加
商品信息的添加执行的是数据表中数据的插入操作,也就是数据库的写入操作。要完成这个功能,需要接收用户通过表单或文件输入的商品信息数据,并对数据进行验证后,交给模型方法来实现。
在控制器admin\goods_admin中新建goods_form()方法,实现商品信息表单的显示,代码如下。
/**
* 商品信息表单,用于商品信息的添加与编辑
*/
public function goods_form() {
// 加载自定义助手函数
$this->load->helper('functions');
// 获取商品类型
$this->load->model('category');
$data['category'] = $this->category->getAll();
// 接收商品ID
$id = $this->input->get('id',true);
// 判断是“添加表单”还是“编辑表单”
if (NULL === $id){
$btn_submit = '添加';
}else{
$btn_submit = '编辑';
}
// 加载表单视图
$data['btn_submit'] = $btn_submit;
$this->load->view('admin/goods/goods_form', $data);
}
由于商品的“商品类型”和“商品等级”数据使用select表单元素,所以,在表单打开时需要初始化它们的值。这些初始值来自数据表wm_category,使用category模型的getAll()方法来获取。页面效果如图9.22所示。

■ 图9.22初始化表单中的select表单元素
另外,页面中的“商品等级”也是采用了select表单元素,但由于它的初始值种类比较少,这里采用数组来初始化它。
定义助手函数htmlGradeOption(),使用该函数来生成“商品等级”选择框中的内容,代码如下。
/**
* 创建“商品等级”表单初始值
* @param unknown $selected_item
* @return string
*/
function htmlGradeOption( &$selected_item) {
// 商品等级
$greads = array('未分级', '普通', '精品', '二手', '过时');
$html = '';
foreach ($greads as $value) {
$html .= '<option value=" ';
$html .= $value;
$html .= '" ';
if (isset($selected_item) && $value == $selected_item) {
$html .= ' selected ';
}
$html .= ' > ';
$html .= $value;
$html .= '</option>';
}
return $html;
}
调用该函数需要传入一个参数,该参数在表单“编辑”功能时使用。它根据商品的等级来初始化选择,如图9.23所示。

■ 图9.23编辑时初始化表单中的“商品等级”值
在控制器admin\goods_admin的goods_form()方法中,接收商品ID数据使用了CI框架的CI_INPUT类的get()方法,该方法获取GET请求数据。
下面的语句:
$id = $this->input->get('id',true);
表示获取以GET方式传递的参数id的值,第二个参数true表示启动XSS过滤功能。
由于商品的添加和编辑共用同一个表单,所以,在加载商品表单时需要判断当前的操作类型。这里使用URL中是否带有id参数来进行区分。
准备好表单以后,就可以实现商品信息的添加与修改功能了。下面先来实现商品信息的添加功能,首先在控制器admin\goods_admin中添加add()方法,其代码如下。
/**
* 商品的添加
*/
public function add() {
// 接收表单数据
$data['goods'] = $this->input->post(null, true);
//$data['goods']['tupian'] = $_FILES['tupian'];
// 加载表单验证类
$this->load->library('form_validation');
// 加载form助手函数
$this->load->helper('form');
// 设置表单数据规则
$rules = array(
array('mingcheng','商品名称','required|min_length[3]'),
array('addtime','上市时间','required'),
array('shichangjia','市场价格','required|numeric'),
array('huiyuanjia','会员价格','required|numeric'),
array('typeid','商品类型','required'),
);
foreach ($rules as $r) {
$this->form_validation->set_rules($r[0],$r[1],$r[2]);
}
if ( true == $this->form_validation->run()) {
// 获取上传图片的文件名
$tupian = 'public/upload/goods/'.time().'.jpg';
$data['goods']['tupian'] = $tupian;
move_uploaded_file($_FILES['tupian']['tmp_name'], $tupian);
// 数据插入
$this->load->model('goods');
$this->goods->add($data['goods']);
redirect('admin/goods_admin');
exit;
}else{
$data['btn_submit'] = '添加';
// 获取商品类型
$this->load->model('category');
$data['category'] = $this->category->getAll();
$this->load->view('admin/goods/goods_form', $data);
}
}
从上述代码可以看出,商品信息的添加总体上分为三个步骤,即表单数据的接收、表单数据的验证和数据的保存。
数据安全是Web项目开发中的一个重要环节,上述代码中采用了CI框架的CI_Form_Validate对象方法来实现表单数据的后端验证。使用该类时需要加载CI框架的form_validate库,最好同时加载form助手函数。
上述代码和视图文件中相关方法的使用,以及数据验证规则,请参考CI框架的使用手册,由于篇幅的限制这里不再详述。图9.24展示了表单数据后端验证的页面效果。

■ 图9.24表单数据的后端验证页面效果
从图中可以看出,“商品名称”文本框中的数据不符合验证规则,这里字符长度最小为3。页面中的验证错误信息为英文,可以下载中文语言包并进行相关设置即可将其汉化。
3. 商品信息的修改
商品信息的修改由控制器admin\goods_admin中的edit()方法来实现,代码如下。
/**
public function edit(){
echo 'goods_admin/edit';
}
上述代码与商品添加的add()方法代码相似,只是使用的模型方法稍有不同而已。由于商品信息的添加与编辑共用同一个表单,所以需要区分不同操作时表单的action属性值。
这里使用页面中的btn_submit参数来判断当前操作类型,也就是根据当前表单的“提交”按钮文本来进行区分。下面是自定义的助手函数。
/**
* 添加与编辑表单action
* @param unknown $btn_submit
* @return string
*/
function setFormAction($btn_submit) {
$action = '';
if ($btn_submit == '添加') {
$action = site_url('admin/goods_admin/add');
}elseif ($btn_submit == '编辑'){
$action = site_url('admin/goods_admin/edit');
}
return $action;
}
视图中的代码:
<form class="layui-form" action="<?php echo setFormAction($btn_submit); ?>" enctype="multipart/form-data" method="post">
为了在编辑表单中显示当前商品的“类型”和“等级”,我们使用了两个自定义助手函数,代码如下。
/**
* 创建“商品类型”表单初始值
* @param unknown $selected_item
* @return string
*/
function htmlCategoryOption(&$category, &$goods) {
$html = '';
foreach ($category as $v) {
$html .= '<option value=" ';
$html .= $v['id'];
$html .= '" ';
if (isset($goods) && $goods['typeid'] == $v['id']) {
$html .= ' selected ';
}
$html .= ' > ';
$html .= $v['typename'];
$html .= '</option>';
}
return $html;
}
/**
* 创建“商品等级”表单初始值
* @param unknown $selected_item
* @return string
*/
function htmlGradeOption(&$goods, $v) {
// 商品等级
$greads = array('未分级', '普通', '精品', '二手', '过时');
$html = '';
foreach ($greads as $value) {
$html .= '<option value=" ';
$html .= $value;
$html .= '" ';
if (isset($goods) && $value == $v) {
$html .= ' selected ';
}
$html .= ' > ';
$html .= $value;
$html .= '</option>';
}
return $html;
}
上述函数能够完成添加操作时select表单元素的初始化,添加操作数据验证出现错误后返回表单页面时select的赋值,以及编辑时的相似操作。
4. 商品信息的删除
商品的删除通过控制器admin\goods_admin中的delete()方法来实现,代码如下。
/**
public function delete() {
// 接收商品ID
$id = (int)$this->input->get('id',true);
// 加载模型
$this->load->model('goods');
// 删除商品
$res = $this->goods->delete($id);
if ($res) {
redirect('admin/goods');
exit;
}else{
$this->load->view('errors/html/error_db');
exit;
}
}
代码中的模型方法delete()在类WM_Model中定义,代码如下。
/**
* 数据的删除
* @param unknown $data
*/
public function delete($id) {
return $this->db->where('id', $id)->delete($this->table);
}
注意: 数据的删除操作一定要设置条件语句。
5. 商品类别管理
商品的类别管理由控制器admin\category_admin来实现,使用的模型为category,视图文件存放在项目views\admin\category子目录中。
商品类别管理功能的实现与商品信息管理基本相同,由于篇幅限制,这里不再赘述。
项目实战
PHP项目案例开发

精彩回顾
参考书籍

《PHP项目案例开发从入门到实战-微课视频版》
ISBN:9787302570974
作者:马石安、魏文平
定价:79.8元

扫码优惠购书
内容简介
本书是为学习PHP程序设计编写的一部实践性教材,详细讲解了PHP项目开发的方法及关键技术。
全书共10章,分为“开发准备”和“项目案例”两篇。第一篇包括第1~4章,介绍了PHP项目开发前的一些准备知识,包括开发环境的搭建、前端技术、后端技术以及PHP框架; 第二篇包括第5~10章,第5~7章介绍了3个PHP课程设计项目案例,即“内容管理系统”“日程管理系统”以及“在线课程系统”,分别采用面向过程、面向对象以及Smarty模板+面向对象的程序设计方法进行开发; 第8~10章介绍了3个PHP的实践性项目案例,即“校园信息平台”“电子商务系统”以及“在线办公系统”,分别采用WordPress开源软件、CodeIgniter框架以及ThinkPHP 6框架技术进行开发。
本书结构清晰、语言简练、内容翔实,具有系统性、综合性和实用性等特点。书中选配的6个项目案例均来自实际,全面覆盖了PHP项目开发的基础理论知识及技术规范,并配套了同步的视频讲解,非常适合具备基本的计算机程序设计知识以及Web技术知识的读者。
本书可作为高等院校计算机专业、网络技术培训中心等相关课程的教材或教学参考书,也可供软件开发人员进行项目开发、在校学生进行课程设计与毕业设计时参考。
编辑推荐
目录
向上滑动阅览
精彩推荐
微信小程序游戏开发│猜数字小游戏(附源码+视频) Flink编程基础│Scala编程初级实践 Flink编程基础│FlinkCEP编程实践 Flink编程基础│DataStream API编程实践 Flink编程基础│DataSet API编程实践 数据分析实战│客户价值分析 数据分析实战│价格预测挑战 数据分析实战│时间序列预测 数据分析实战│KaggleTitanic生存预测






