此购物系统模仿实体购物流程,分为前台跟后台开发。前台即相当于顾客,而后台相当于商家。前台所需会员登陆注册功能,在线商品浏览,分类查看商品信息,选购功能,在线支付交易,在线留言功能。后台所需基本的订单管理,会员管理功能,商品发布管理,商品栏目管理等功能。
购物系统,采用经典的PHP+MySQL+Apache黄金组合开发。严格基于MVC开发思想,做到数据与页面显示层分离,从细节着手,在实现网上购物需要的功能之外,尽量从消费者角度出发,最终达到界面美观友好。使用者操作便捷。商家也更加容易使用,实现系统的易用性。
关键词:网上购物,MVC开发模式,PHP开发,网上支付
DesignandImplementationofOnlineShoppingMallSystem
Author:TangPan
Tutor:WangHexing
Abstract
WiththeriseoftheInternet,onlineshoppinghasbecomeatrendintoday'ssociety.Onlineshoppingisaninevitabletrendisnowmostpeople'smindsFujiconsensus.Comparedtotraditionalshopping,onlineshoppingmoreconvenientadvantages,coupledwiththeconstructionnowsupportinglogistics,onlinepaymenttechnologyimproved.Allowsconsumerstobeabletodowithoutleavinghome,youcanenjoysafeandconvenientshoppingprocess.Thusmoreandmorepeoplebegantopro-gaze"onlineshopping."Theonlinestorecanbesubjecttogeographical,time,weatherandotherfactors.Alsopromptedmoreandmorebusinessesmoveclosertotheelectricitysupplier.ButwiththerapiddevelopmentofnetworktechnologyinstarkcomparisonisdirectlyrelatedtothebusinesscrowdengagedinInternet-relatedtechnologiesforalimitedmastery,especiallysmallandmediumsizedbusinesses.Therefore,thedevelopmentofonlineshoppingmallsystemcameintobeing.
Thisshoppingsystemmimicsphysicalshoppingprocess,dividedintofrontwithbackgrounddevelopment.Receptionisequivalenttocustomers,andthebackgroundisequivalenttothemerchant.ReceptionLoginrequiredregistrationfunction,browsingonlineproducts,classificationviewmerchandiseinformation,optionalfeatures,onlinepaymenttransactions,onlinemessagefunction.Backgroundrequiredbasicordermanagement,membershipmanagementfunctionality,merchandisereleasemanagement,commoditypartmanagement.
Shoppingsystem,usingtheclassicPHP+MySQL+ApacheGoldportfoliodevelopment.StrictlybasedontheMVCdevelopmentthinking,sothatdatapagedisplaylayerwasseparatedfromthedetailsoftheset,intherealizationofonlineshoppingfunctionalityrequired,thepossiblefromtheconsumerpointofview,andultimatelyachievebeautifulandfriendlyinterface.Usereasyoperation.Businessesarealsoeasiertouse,easeofimplementationsystem.
KeyWords:Onlineshopping,MVCdevelopmentmodel,PHPdeveloper
在这个信息时代,信息技术的不断发展和Internet互联网技术的日益普及,网络已经成为人们日常学习生活中重要的一部分。浏览信息,享受服务,享受高科技带来的便利的同时人们越来越意识到网上购物给企业商家和个人生活所带来的巨大影响。而作为网络服务主流的网上购物更是具有开发潜力。
中国网购发展速度非常快,2012年统计数据网购占社会商品零售总格的比重从0.34%升至4.32%。中国网购发展如此之快,西方很难想象。中国网购迅速发展的一个重要原因是商业业态没有西方国家发达,网购利用中国正在工业化、城镇化的机会有了一个巨大的发展空间。网购正在改变着人们的生活、消费的方式,这样对物质文化生活的提高,促进整个国家用消费来拉动经济会起到很大的作用。
在网络购物的过程中,通过人与电子通讯方式的结合,极大地提高了网上购物的活动的效率,减少了不必要的中间环节。同时,网上购物过程产生的网上支付行为的发展也将转变政府的行为。在网络购物逐渐变的流行的时代里,当企业应用网络购物商城进行经营,银行实现金融电子化,以及消费者实现网上消费的同时,也将对政府管理行为提出新的要求,国外在这方面有很好的法律法规加以约束,防止商业欺诈行为。但是国内在这方面做的就没有国外的好,没有一定的规范加以约束,我们经常可以看到一些消费者在网上购买的东西和实际不一样,发现上当后我们也无能为力。
在国内有很多大型的电子商务公司,像淘宝B2C商务平台、阿里巴巴就是专门提供B2B商务平台、还有一些像京东主要以卖图书为主、聚美优品新起的以卖化妆品为主的电子商务公司。现在国内的网购的发展,越来越朝着细分市场发展。这也是未来电子商务发展的方向-细分市场。以及催生一系列网上支付中介公司。像易宝支付,支付宝等等。在一定程度上保证了网上购物的支付的安全性。所以在网络购物这片领域发展的越来越成熟的环境中,网络购物是具有巨大未来市场潜力的。总而言之,网络购物是一种不可阻挡的趋势跟潮流这是现在人们统一的认识。
本文的组织结构如下:
第1章绪论。主要论述了系统开发的背景以及意义。对目前国内的网络购物形势状况进行了基本介绍。阐述了网络购物给人们生活带来的便利变化,同时网购中存在的一些安全诚信问题。开发一个网上购物商城系统是有必要的,也是具备实际意义的。解决中小型商家的实际问题。
第3章系统需求分析。分析了本系统的可行性,简单阐述了在实际中的开发成本以及开发实现的可能性。然后对系统基本运行环境进行了说明。从实际入手,介绍系统功能需求。最后画出系统基本的框架图。
第4章详细设计与实现。本章主要介绍了系统的主要功能模块。并对各个模块做了详细分析介绍。同时也阐述了系统各个功能模块流程设计跟界面展示。对主要功能段的代码进行了描述跟展示。
最后对全文进行了总结,并且对其中需要进一步完善的地方进行了说明。
PHP,是英文超文本预处理语言HypertextPreprocessor的缩写。PHP是一种HTML内嵌式的语言,是一种可以跨平台在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,但是比C语言功能强大.同时混合了java语言面向对象的风格,C++的风格,但是比java也更加简洁。特别是语法风格方面,比Java简洁。PHP是现在大部分网站采用的语言。也是现阶段最流行的语言。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。PHP具有非常强大的功能,所有的CGI的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系统。
PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的WEB站点。总之,PHP是一种可以跨平台的服务器端嵌入式的脚本语言。支持几乎所有流行数据库,没有操作系统的限制。语言风格简洁,功能强大,成本低廉,安全性高。是时下开发动态网站最流行的语言。
Html+css+js是web前端技术必须会的利器组合。缺一不可,是制作动态网页必须掌握的技术。
Html即是超级文本标记语言(英文缩写:HTML)是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)。浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。但需要注意的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因而可能能会有不同的显示效果。
Css是级联样式表(CascadingStyleSheet)简称“CSS”,通常又称为“风格样式表(StyleSheet)”,它是用来进行网页风格设计的。比如,如果想让链接字未点击时是蓝色的,当鼠标移上去后字变成红色的且有下划线,这就是一种风格。通过设立样式表,可以统一地控制HTML中各标志的显示属性。级联样式表可以使人更能有效地控制网页外观。使用级联样式表,可以扩充精确指定网页元素位置,外观以及创建特殊效果的能力。作用在客户浏览器端。
Div元素是用来为HTML文档内大块(block-level)的内容提供结构和背景的元素。DIV的起始标签和结束标签之间的所有内容都是用来构成这个块的,其中所包含元素的特性由DIV标签的属性来控制,或者是通过使用样式表格式化这个块来进行控制。DIV标签称为区隔标记。作用:设定字、画、表格等的摆放位置。当你把文字,图象,或其他的放在DIV中,它可称作为“DIVblock”,或“DIVelement”或“CSS-layer”,或干脆叫“layer”。而中文我们把它称作“层次”。
特别是随着html5跟css3的发展,使得web页面开发又会引起新一轮的技术革新.在web页面美观,布局的方面可以使得有更好的施展拳脚的空间,并且减少了很多冗杂的标签,增加了更多的媒体标签,使得web在网页布局方面有了新层次的提升。并且更注重网站的搜索效率--即SEO优化.但是因为浏览器之间的区别,导致不同浏览器存在一些支持上的差异,但是html5是一种未来的趋势,浏览器也必将来适应html5的发展潮流。
MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的SQL语言是用于访问数据库的最常用标准化语言。使用于中,小型网站.由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其免费版的性能卓越,搭配PHP和Apache可组成良好的开发环境。而下面我们要搭建的Web测试环境就是利用MySQL+PHP+Apache这组黄金搭档。这里采用图形化界面的MyphpAdmin来操作SQL数据库。所以具有更加灵活跟便捷,直观的优势。增加开发效率,跟传统的命令控制台相比-这明显提高界面对开发者更加友好程度,使得维护数据库更加容易直观。
安装MySQL后,安装MyphpAdmin进行对数据库管理操作。系统中,我将myphpadmin的连接地址直接写到到了phpinfo文件中,做成一个链接地址,以供方便访问。在访问本地localhost的时候,就可以快速通过页面的链接地址定位直接进入MyphpAdmin进行测试检验。运搭建web服务器,主要是搭建一个php+Mysql的环境。用来支撑项目跑起来的运行环境。
1.先安装apache服务器,在地址栏键入127.0.0.1进行测试,测试是否安装成功。
2.安装php文件包,用来搭建php的解析环境。因为apache服务器是通过配置文件加载相对应的模块工作。需要php的时候,则需要在配置文件里面,加载对应的php动态链接文件。
现在开始将php以module方式与Apache相结合,使php融入Apache,具体配置代码如下:
具体的配置信息代码如下
#加载php模块
LoadModulephp5_moduleD:/andy/php5/php5apache2_2.dll
#指定php的ini文件,该文件对php的一些配置
PHPIniDir"D:/andy/php5
并将php.ini.deployment改成php.ini启用开发模式.
指定php的拓展库路径:
在php.ini中制定拓展块路径extension_dir=~php安装路径/ext
注意事项,自动识别index.php的代码。
在apache的conf文件中,找到DirectoryIndex,添加如下代码:
DirectoryIndexindex.phpdefault.phpindex.htmindex.htmldefault.htmdefault.html否则不能自动识别index.php。
3.接下来就是整合MySQL数据库。将下载的MySQL安装软件,解压按照提示安装就可以。
图2.1服务器搭建运行测试效果
结果成功如图2.2所示:
图2.2phpMyadmin界面
#网上商城项目
ServerNameshop.com
ServerAliaswww.shop.com
DocumentRoot"D:/andy/apache/htdocs/shop"
DirectoryIndexindex.phpindex.html
OptionsFollowSymLinks
AllowOverrideAll
OrderDeny,Allow
Allowfromall
然后配置本地的hosts文件,添加进一句代码127.0.0.1www.shop.com即将域名解析到本地需要的地址上面。这样一来就可以在地址栏中输入www.shop.com测试结果如下图2.3所示:
图2.3访问虚拟主机
易宝支付是中国领先的独立第三方支付平台,其最大的特点,是实现了银行信用卡还款到账功能。易扩展的支付、易保障的支付、易接入的支付。由于用户的重要数据只存储在用户开户银行的后台系统中,任何第三方无法窃取,因此为用户提供了充分保障。从接入易宝支付到使用商家管理系统,无需商家任何开发,零门槛自助式接入,流程简单易学、即接即用。凡是成为易宝支付的客户,都可以自动成为易宝支付财富俱乐部的会员,享受易宝支付提供的各种增值服务、互动营销推广以及各种丰富多彩的线下活动,拓展商务合作关系,发展商业合作伙伴,达到多赢的目的。
其开发的接口,供第三方商家使用,从而避免了商家直接与银行接口打交道的麻烦。易宝支付直接做好各个银行的接口,提供专门开放的接口给商家使用,并且提供特定的商家id跟唯一的相配密钥以保障安全。省去了商家跟不同银行打交道的麻烦,商家可以不用知道如何跟银行对接,只需要跟易宝支付提供的接口对接就可以完成网上电子支付转账的功能。接口工作原理大概如下图2.4所示:
图2.4易宝支付工作原理
MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。
控制(Controller)可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后,并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能。
此次系统的开发,都将严格基于MVC模式思想进行开发。
本系统拟采用PHP和MySQL分别作为开发语言和数据库。使用免费的Apache服务器作为web服务器,分别采用ZendStudio作为集成开发工具跟phpMyadmin作为数据库的管理工具。
首先,技术可行性。本系统仅需要一台配置好php+mysql的apache服务器环境软件的计算机即可,对机器本身没有太高的要求,一般当前个人电脑完全可满足要求。对软件技术要求,由于系统本身采用MVC三层模式开发,所以前台view层页面,可以不用完全自己开发,从网上参考有价值的template模板作为合适的view层即可。主要自己来开发后台跟的Model层跟Controller业务逻辑层。
本地计算机硬件环境以及软件环境如下表3.1所示:
表3.1本地环境配置列表
本地计算机的配置
详细配置信息
处理器
酷睿双核
内存
2G
硬件空间
320GB
开发环境
Widows7系统
数据库
MySQL
编程语言
PHP5.2
服务器
Apache2.2
其次,经济可行性。由于本系统是完全采用免费的黄金组合搭档php+mysql+apache。都是免费的,而且前台框架是view是ECshop的模板。以便开发简单且适合小型公司的网店,独立区分于茫茫大潮中的淘宝店中。所带来的效益远远大于系统软件的开发成本。在经济上完全可行。
根据分析,为了较好的实现网上购物网站,系统应该实现如下基本功能如表3.2所示:
表3.2网站大概功能需求表
功能模块
实现功能
后台管理方面
商品分类管理、添加与修改商品、管理订单、商品留言管理等功能
管理网站用户
用户管理、后台管理员管理等功能
用户管理方面
用户注册、验证码登陆、资料修改等功能
用户订购方面
在线订购、在线支付、购物车、查看订单、信息反馈等功能
商品展示方面
二级分类展示、首页精品推荐、新品发布、销售排行
网站购物信息方面
汇款方式、送货方式、定购方式等功能
首页功能方面
SHAPE\*MERGEFORMAT
修改个人信息
模块
用户
注册模块
商品展示模块
购
物
车
模
块
对购物车里面商品进行操作,最后提交生成订单
支
付
浏览器
图3.1前台基本框架
后台基本框架图,后台就是对订单进行管理,会员信息进行管理,最主要的就是对商品进行添加删除操作,商品栏目的管理与更新。框架图如图3.2所示:
后台登陆成功
会员管理
商品分类栏目管理/
商品管理
订单管理
图3.2后台基本框架
系统采用了MVC开发模式的思想,对整个系统分成了3个大模块:前台的view层、数据库Model层、业务逻辑层Controller层。又对各个模块又进行了一步的细分,如前台view层模块又分前台跟后台模块;前台主要包括会员注册、商品选购、购物车、商品结算、商品订购反馈、新品、热销。后台主要包括会员管理,订单管理,商品管理,商品栏目管理。Model层则采用严格封装;使得系统具有易用性、个性化、跨平台等特点,代码的复用性;使其运行得高速、安全、稳定。
首先搭建基本的框架,框架首先必须具备的条件如下表4.1所示:
表4.1框架基本要素表
框架的基本要求/要素作用
配置文件和配置文件读取的功能灵活读取更改数据库信息
良好的数据库处理类底层基本数据的增删改查
良好的目录结构开发者便于开发
正确的路径结构便于网站的移植
具体配置文件和配置文件读取的功能文件
几乎所有的文件都应该要连接数据库,所以一般将这个文件单独写到一个底层文件中,然后通过初始化文件,引入包含进去。基本配置文件config.php代码如下:
网站的配置文件,将数据库信息作为一个数组保存。包括基本的连接密码、数据库名、编码格式(一般都是设置成utf8编码)等。代码清单4.1
代码清单4.1网站数据库配置信息
$_cfg['user']='root';
$_cfg['pwd']='tangpanpan314';
$_cfg['db']='shop';
$_cfg['char']='utf8';
良好的数据操作,应该是有日志记录。所以在配置文件信息里面加入判断日志记录是否开启字段,以方便管理员管理。
$_cfg['debug']=true;
通过读取网站配置文件conf.class.php来读取和更改网站的配置信息。代码如下:
配置文件的读取类用来读取config.php,并能返回某个配置选项的值,在配置读取类文件中,一般都是采取单例模式,减少不必要的重复多次反复生成连接对象开销。读取网站配置文件代码清单4.2所示:
代码清单4.2读取网站配置信息
classconf{
privatestatic$ins=false;
private$info=array();
finalprotectedfunction__construct(){
require(ROOT.'includes/config.php');
$this->info=$_cfg;
}
finalprotectedfunction__clone(){
获得一个单例
publicstaticfunctiongetIns(){
if(self::$ins===false){
self::$ins=newself();
returnself::$ins;
读取获得配置的网站信息
publicfunction__get($key){
if(array_key_exists($key,$this->info)){
return$this->info[$key];
}else{
returnnull;
良好的数据库处理类
数据库底层的基本都离不开的是增删改查,所以把这些sql语句全部封装到底层的sql类中。取得一行数据,取得所有数据,并且做一个简单的日志记录也是必要的。代码如下:mysql.class.php文件
数据库处理类,灵活的数据库底层封装类,应该首先具备的公共易用性、灵活性等功能。所以数据底层处理类,必须封装数据库连接、数据库的选择、数据库语言执行、获取数据执行后返回对象、最后还必须具有错误提示功能。
数据库的连接功能代码清单如下:通过数据配置文件读取相对应的信息值,连接如果不成功,返回对应不成功信息。连接数据库代码清单4.3所示:
代码清单4.3数据库连接
protectedfunctionconnect(){
$this->conn=mysql_connect($this->conf->host,$this->conf->user,$this->conf->pwd);
if(!$this->conn){
$err=newException('连接失败');
throw$err;
选择数据库,这是底层封装类必备的灵活性。通过拼接sql语句,来更改引用的数据库。选择数据库代码清单4.4所示:
代码清单4.4选择连接数据库
protectedfunctionselect_db($dbname=''){
if($dbname==''){
$sql='use'.$this->conf->db;
$this->query($sql);
指定字符编码格式,在中英文切换的时候,很重要。但是在本次开发系统中,基本采用的utf8中文格式。设置数据库字符编码代码清单4.5所示:
代码清单4.5数据库设置字符编码
protectedfunctionsetChar(){
$sql='setnames'.$this->conf->char;
return$this->query($sql);
Sql语言的执行函数,先判断配置文件里面的日志记录是否开启,如果开启则记录对应的sql语言操作。如果执行sql语句出错,则报错,并且记录错误信息日志。记录日志如代码清单4.6所示:
代码清单4.6记录日志
publicfunctionquery($sql){
if($this->conf->debug){
$this->log($sql);
$rs=mysql_query($sql,$this->conn);
if(!$rs){
$this->log($this->error());
return$rs;
将sql语句执行结果封装到底层函数,因为有时候需要获取所有的关联的结果,有时候就只需要一行结果就行。所以封装获取结果函数时候,分别封装两个函数。一个用来获取所有执行结果,一个用于获取一行结果。通过数组的形式返回。获取sql语句返回值代码清单4.7所示:
代码清单4.7获取sql返回值
publicfunctiongetAll($sql){
$rs=$this->query($sql);
$list=array();
while($row=mysql_fetch_assoc($rs)){
$list[]=$row;
return$list;
publicfunctiongetRow($sql){
returnmysql_fetch_assoc($rs);}
封装受影响的行数函数,在有时候判断sql语句是否执行成功很重要的判断依据。返回影响行数的函数,如代码清单4.8所示:
代码清单4.8返回受影响的行数
publicfunctionaffected_rows(){
returnmysql_affected_rows($this->conn);
代码清单4.9日志记录函数
publicfunctionlog($sql){
$log=ROOT.'data/mysql.log';
if(!file_exists($log)){
$fh=fopen($log,'w');
if(filesize($log)>1024*1024){
$fh=fopen($log,'a');
fwrite($fh,$sql."\r\n");
fclose($fh);
上面底层的封装的sql类,集合了常用的连接数据库功能,还包括基础的数据库的执行操作。并且做一个日志记录sql语句操作功能。
良好的目录结构
将底层文件分别新建model文件,里面保存model模型类。Includes文件夹,里面包含网站所需的运行配置文件。再新建一个helper文件夹,里面保存一些可能会重复用到常用功能代码文件。比如像图片水印效果,分页等功能。
正确的路径结构
因为网站发布可能在未知的环境下进行,所以网站文件的引用最好采用相对路径的引用。在初始化文件中对此首先定义好,对网站的根目录定义成一个常量ROOT。网站的初始化文件,负责计算当前网站的根目录,负责引入所有页面都需要的引入的公共文件。init.php文件如下代码清单4.10所示:
代码清单4.10网站初始化文件代码
define('ROOT',str_replace('\\','/',str_replace('includes\init.php','',__FILE__)));
include(ROOT.'includes/conf.class.php');
include(ROOT.'includes/mysql.class.php');
include(ROOT.'includes/lib_base.php');
function__autoload($class){//$class是new类名(),是类名
if((stripos($class,'model'))!==false){
include(ROOT.'model/'.$class.'.php');
include(ROOT.'helper/'.$class.'.php');
session_start();
初始化session,在此系统中,session是要多次用到,所以将session也放置到初始化文件中。
先将Ecshop的view模板解压到,apache服务器的hosts文件下。(其实这里在任何地方建project都可以,因为在vhost里面配置虚拟主机的时候会标识。最后都是通过虚拟主机来访问网站。)通过基本的连接,将路径都走通。然后再对系统的主界面进行设计。模板中有用的模块能够用得上的,先设置好。再对自己将要开发的模块进行设计。采用”先死后活”的方法,先写成静态的Html页面,然后再对各个部分要实现的功能进行实现动态化。
系统前台主界面大概如下图4.1所示::
图4.1前台界面
系统后台管理界面如下图4.2所示:
图4.2后台管理界面
字段信息如表4.2所示:
表4.2商品表字段以及重要字段的分析
名称数据库字段作用
商品主键goods_id商品唯一的标记id定位不同的商品
商品货号goods_sn商店通过不同的货号来区分不同的商品
栏目idcat_id商品都是属于不同商品栏目
商品名goods_name商品名是给顾客最直观的名称
本店价格shop_price商品价格是商品属性必备值
市场价格market_price这是突出自己跟市场的差异体现自己的价格上的优势
库存量goods_number在交易的过程中先得看看库存里面是否还有货
商品重量goods_weight在选择物流时候的收费标准
简短描述goods_brief简短描述
商品描述goods_desctext包含商品所有属性
小图片thumb_img首页展示的小图
大图片goods_img详细信息时候展示大图
原始图片ori_img商家上传的原始图片作为以后的凭证
是否上架is_on_sale缺货或者下架时候的标记位
是否删除is_delete在商品删除的时候一般不作物理上的删除只做一个标记位
是否精品is_best在前台展示确认精品的标记位
是否新品is_new新品的标记位
是否热卖is_hot热卖标记位方便管理者设置热卖商品
Cat_id栏目id、Cat_name栏目名称、Parent_id栏目所属父目录。在商品面包屑导航过程中,这个极为重要。通过递归调用,查找父节点。
具体实现的Sql语句如下代码清单4.11所示:
代码清单4.11商品栏目生成sql代码
createtablecategory(cat_idsmallintunsignedprimarykeyauto_increment,
cat_namevarchar(10)notnulldefault'',
parent_idsmallintunsignednotnulldefault0)
订单表跟订单关联表,先要了解订单表形成的流程跟两张表之间的关联。其形成的基本要素图如下图4.3所示:
Order_id
姓名
手机
地址
配送方式
支付方式
3
Xx
Xxx
X
图4.3订单表基本要素图
Goods_id
Rec_id
Subtotal
4
5
9
订单3
图4.4订单商品关联表图
具体实现订单商品管理sql如代码清单4.12所示:
代码清单4.12订单商品管理表sql语句
createtableorder_goods(
rec_idintunsignedprimarykeyauto_increment,
order_idintunsignednotnulldefault0,
goods_idintunsignednotnulldefault0,
goods_namevarchar(30)notnulldefault'',
numsmallintunsignednotnulldefault1,
pricedecimal(9,2)notnulldefault0.00,
subtotaldecimal(9,2)notnulldefault0.00,
)
后台管理模块的设计,最重要的就是商品的增删改查功能。其他会员管理,订单管理,栏目表的管理。都是简单的一个增删改的语句就可以实现。而在商品管理中,必须涉及到图片的上传,图片的缩放等功能。形成缩略图,是商品上传必须解决的问题。在后台模块中,涉及到列表问题时候,就离不开分页功能小模块。而且不论是前台,还是后台。只要涉及到列表展示的时候,必须会涉及到分页功能。因此分页功能可以单独做一个modle层模块。
商品管理,包括商品的增删改查,但是商品管理中,有一个要注意的地方,就是图片的上传,还包括图片的水印,统一大小的图的前台展示。所以图片的上传跟水印是这部分的难点。其中还包括商品序列号的不重复自动生成功能。
大致思路如下:
1:接收POST数据
判断商品名为空,货号是否为空,栏目是否选中
2:把收到的POST的形成数组,数组的键名与字段一一匹配
上传商品图片,new一个上传类封装对象。
$upfile=newupfile(2,'jpeg,jpg,gif,png,bmp');
$data['ori_img']=$upfile->up('ori_img');//路径或false
生成缩略图,因为在商品展示中,为了统一美观的效果,一般都是生成统一大小的缩略图。在展示的时候,展示出来。
if($data['ori_img']){//判断是否上传了图片
$data['goods_img']=ltrim(str_replace(ROOT,'',image::thumb(ROOT.'/'.$data['ori_img'],230,230)),'/');
上传文件是一个普通常用的功能,因此将upfile单独做一个封装功能模块。放在常用的工具类文件夹里面。以供系统所需调用。
文件上传是通过php内置函数,upload上传到服务器,以临时文件存在。要保存上传文件,需要将临时文件移动到要保存的文件夹下面。移动文件的函数move_uploaded_file实现。如果移动失败,则返回失败信息提示。如代码清单4.13所示:
代码清单4.13文件上传函数
if(!move_uploaded_file($this->info['tmp_name'],$path)){
$this->error='移动文件失败';
returnfalse;
returnltrim(str_replace(ROOT,'',$path),'/');
生成目录文件夹,指定到对应的文件夹下面。最后指定对应的创建文件的权限。这个在windows系统下没有什么作用,但是在linux下面,是十分重要的。如果没有对应的权限,是不能对文件夹进行操作的。如代码清单4.14所示:
代码清单4.14创建文件夹
protectedfunctionmk_dir(){
$path=ROOT.'/data/images/'.date('Ymd',time());
if(is_dir($path)){
return$path;
returnmkdir($path,'0777',true)$path:false;
代码清单4.15生成随机文件名函数
protectedfunctionrandName(){
returndate('md',time()).rand(100000,999999);
检验文件大小,判断文件的大小。是否符合上传要求。具体实现如代码清单4.16所示:
代码清单4.16检验文件大小
protectedfunctioncheckSize(){
if($this->maxSize<=0){
returntrue;
return$this->maxSize*1024*1024>=$this->info['size'];}
文件栏目展示列表:/admin/catelist.php
作用:按层次展示栏目列表
流程分析如图4.5所示:
catelist.php
查询数据
Foreach显示
是否有数据
没有数据
否
是
图4.5商品列表展示流程图
需要先select出数据,赋给数据,
判断数组是否为空,并提示为空或显示
$sql='select*fromcategory';--->在model里调用。常用的增删改查sql语句将封装在底层。供上层的controller层进行调用。
/Cateadd_ok.php:作用:添加新栏目。步骤如下::
接收POST数据
判断POST数据的完整性,与合法性
实例化cateModel
形成数组,调用model的方法进行栏目的新增。
流程图如图4.6所示:
添加栏目
接收数据
数据信息合法
添加该栏目
提示退出
选定栏目层级
非法
合法
图4.6栏目添加流程图
Catdel.phpcat_id=N:作用:删除栏目N。栏目的删除,步骤如下:
从地址栏接收cat_id
调用cateModel的删除方法,商品删除流程图如图4.7所示:
删除栏目
删除该栏目
是否有子栏目
提示栏目非空
有
没有
接收cat_id
Cat_id合法
图4.7栏目删除流程图
Catedit_ok.php修改栏目
步骤:
判断数据完整性与合法性
调用model进行修改
判断修改的结果。修改栏目流程图如图4.8所示:
修改栏目
判断数据
接收数据id
不合法
失败退出
判断新的父栏目是否是自己的子孙栏目
提示错误信息退出
不是
修改
图4.8商品栏目修改流程图
会员管理模块,跟栏目模块相类似。也都是增删改查,基本的流程也都是相似。其中分页功能,在网站中,很多地方都会要用到页面分页这个功能。因此将这功能页面单独写作一个工具类,保存在helper文件夹中在做页面分页的过程中。主要是获取所有数据库信息的条数。然后分页页面要展示的数目,一次取多少条数据。然后可以通过总的数据库数据条数除每一页需要的显示的条目向上取整。可以得出取得页数,然后根据页数。通过id=N来计算当前页具体获取数据库里面的具体的那些数据。往前往后取多少条数据,offset参数来做标识。通过url来传值,通过解析url的id等于多少,在确定在数据库里面信息取多少。在界面里面,就是一个超链接地址,通过地址键入不同的url的值来获取不同的页数信息。
订单模块也是跟前面,栏目管理模块相类似。就是后台管理员对产生的订单情况进行查看,修改等。所以关键代码跟前面栏目管理相似,可以直接复用栏目管理的思,代码做微小的改变即可实现。这是MVC模式开发的优势,对相似的功能的代码可以实现复用。
其实前台模块的设计开发是由一些列的小模块组成起来的。前台模块就是一个大的合集。像前台页面一些基本功能的实现,其实由一个小小的功能模块组成。而最主要的模块,就是商品展示模块。
publicfunctioncheck($u,$p=''){
if($p){
$sql="selectuser_id,username,emailfromuserwhereusername='".$u."'andpwd='".$this->encPass($p)."'";
return$this->db->getRow($sql);
$sql="selectcount(*)fromuserwhereusername='".$u."'";
return$this->db->getOne($sql);
密码进行MD5加密的方法,这里采用的md5加密,可以其实可以直接用md5函数,不用单独写一个方法。但是单独写一个方法,可以方便日后如果采用其他的加密方式,更改起来更灵活。减少一个日后不必要的麻烦跟开销。代码清单如4.18所示:
代码清单4.18密码加密函数
protectedfunctionencPass($str){
returnmd5($str);
其中在view层的注册登陆时候,直接写了一个js简单的register函数方法验证。防止空白用户跟密码等一些不合法的情况的输入,比如在注册时候,先检验一下用户是否两次输入的密码相同。而登陆的时候也是同样的道理验证。
运行效果如图4.9所示::
图4.9登陆界面
导航是一个网站必备的,而导航最常见跟经典的就是面包屑导航.关于面包屑导航,就是关于子节点找父节点的方法,采取递归调用便可以实现。而这个是作为商品栏目分类中一部分存在。具体controller层实现如代码清单4.19所示:
代码清单4.19寻找家谱树函数
//根据栏目cat_id寻找家谱树
publicfunctionfamilyTree($arr,$cat_id){
static$list=array();
foreach($arras$v){
if($v['cat_id']==$cat_id){
$this->familyTree($arr,$v['parent_id']);
$list[]=$v;
View的显示层结果用一个foreach循环来实现。运行效果图4.10所示:
图4.10面包屑导航
商品展示模块,包括畅销、推荐、新品这个三个模块其实相当于一个模块,因为基本的底层代码都差不多。这个页面也可以算作是一个商品展示页面,在数据表的设计过程中,设置标记位,通过标记位来识别商品的属性是否为畅销,推荐或者新品。这个是功能模块式属于商品模块中的一部分。(因为view模板中,是设置好的数目已达到页面的美观的效果,这个可以自由的更改取出的数据条数。)
商品展示页面,将商品的详细信息都给展示出来。即把从数据库获取出来的的商品详细数据根据需要都给展示出来。在点击商品图片时候进入商品详细信息,商品的描述,属性等功能。即从数据库读取商品所有的属性列值,在展示商品的时候,添加了一些js效果,使得看起来更美观。
运行效果如图4.11所示:
图4.11商品展示界面
这个是开发过程中一个必要的模块,不同的型号的商品可能属于同一个类别下面,更便于使用者操作。而且在开发过程中,在foreach循环展示数据的时候,也是采用递归调用的办法。得注意父子节点之间的关系,实现如代码清单4.20所示:
代码清单4.20递归找子孙数函数
publicfunctioncatSort($arr,$pid=0,$lev=0){
if($v['parent_id']==$pid){
$v['lev']=$lev;
$this->cateList[]=$v;
$this->catSort($arr,$v['cat_id'],$lev+1);
这是一个购物网站必备的功能,购物车展示。同时计算购物车里面的价格。购物车实际上是一个订单表的形成,临时对顾客选购的商品进行保存。购物车的处理流程就是提交到订单,其实关键是里面订单表的设计,订单表跟货物关联表之间的关系设计。购物车作为单独的一个模块,购物车要实现购物车里面商品的增删改查功能。购物车添加商品,其实是通过url地址栏中id来确定传入的商品信息。而购物车,相当于一个session文件。运行效果图4.12所示:
图4.12购物车界面
网上支付有两种方法,一种是直接跟银行对接,另外一种就是在此系统中用到通过中间代理机构对接银行。在这次的开发中采用的是易宝支付作为中间机构。选取中间机构进行跟银行的对接,适合这种小型交易金额的项目。一般银行不接受小金额的交易的直接对接口。而且采用中间支付机构,可以省去银行不同的接口或者银行因为升级而要更新接口的麻烦。采用中间支付机构,我们只用按照中间支付的规定原则,与中间支付机构提供的接口对接,而不用管中间支付机构跟银行如何对接。在选用中间支付机构时候,应该注重安全性跟可靠性。所以一般选取规模大、有影响力的、信誉度高的中间支付机构。我们在这里采用的是易宝支付作为中间支付机构。其实易宝支付接口,就是一个url地址。但是这个地址是对大家公开开放的。
支付宝给商家提供一个唯一的商号id跟对应的密钥。以保证交易过程中的安全性。商号id是商家向易宝支付申请的,与之同时会产生一个对应的密钥。在交易过程中,密钥是确定两者之间安全进行的凭证。注意这里,我采用的网上公共测试账号跟密钥。
代码清单4.21具体订单信息获取提交
//订单支付获取提交过来的信息
$p0_Cmd="Buy";
$p1_MerId="10001126856";
$p2_Order=$orderinfo['order_sn'];
$p3_Amt=$data['price'];
$p4_Cur="CNY";
//商品名称
$p5_Pid="";
//种类
$p6_Pcat="";
//商品介绍
$p7_Pdesc="";
//易宝支付成功后,给url返回信息
//送货地址
$p9_SAF="0";
//易宝保存地址,默认为0.不保存
$pa_MP="0";
$pd_FrpId=$_REQUEST['pd_FrpId'];
//应答机制
$pr_NeedResponse="1";
//请求参数拼接,严格按照开发文档手册的顺序。
$data="";
$data=$data.$p0_Cmd;
$data=$data.$p1_MerId;
$data=$data.$p2_Order;
$data=$data.$p3_Amt;
$data=$data.$p4_Cur;
$data=$data.$p5_Pid;
$data=$data.$p6_Pcat;
$data=$data.$p7_Pdesc;
$data=$data.$p8_Url;
$data=$data.$p9_SAF;
$data=$data.$pa_MP;
$data=$data.$pd_FrpId;
$data=$data.$pr_NeedResponse;
//商家密钥
$merchantKey="69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
//易宝支付与商家之间的约定的加密方式。
functionHmacMd5($data,$key)
{
//RFC2104HMACimplementationforphp.
//Createsanmd5HMAC.
//EliminatestheneedtoinstallmhashtocomputeaHMAC
//HackedbyLanceRushing(NOTE:Hackedmeanswritten)
//需要配置环境支持iconv,否则中文参数不能正常处理
$key=iconv("GB2312","UTF-8",$key);
$data=iconv("GB2312","UTF-8",$data);
$b=64;//bytelengthformd5
if(strlen($key)>$b){
$key=pack("H*",md5($key));
$key=str_pad($key,$b,chr(0x00));
$ipad=str_pad('',$b,chr(0x36));
$opad=str_pad('',$b,chr(0x5c));
$k_ipad=$key^$ipad;
$k_opad=$key^$opad;
returnmd5($k_opad.pack("H*",md5($k_ipad.$data)));
//hmac是签名串,用于易宝和商家相互确认
$hmac=HmacMd5($data,$merchantKey);
图4.13在线支付界面
本文通过此次毕业设计网上商城系统设计与开发,从而得出下列结论:
首先,学习一门新的技术,最重要是实践,只有多动手才能尽快掌握它。实践出真知是不变的道理。纸上得来终觉浅,缘知此事要躬行。其次,一个完善的系统的开发,最重要的是经验,如果经验不足,就难免会有许多考虑不周之处。所以在开发过程中,多参考别人的类似的项目,从而可以避免一些弯路。再次,一个开发较好的系统,是可以吸引更多的用户,具有用户友好性的特性。所以这就必须要求系统的界面必须要美观、有特色、友好,功能要健全。不过由于经验不足,我设计的界面,主要是参考的Ecshop的view模板。然后对基本功能进行了开发。最后,在本次开发中,我对自己的毕业设计进行了完善,但是还有很多的不足之处,有待以后进一步学习提高改进。
由于本次毕业设计由自己一个人设计完成制作,对我这样一个PHP新手而言,所制作的模块还有很多不完善的地方。数据库的设计,业务逻辑流程也比较处理的比较简单。还有很多毕业设计中用到PHP跟SQL语言的知识也不够全面,还有很多地方跟细节的处理不能够作到完全的理解和掌握。但是通过这次毕业论文的设计制作使我个人受益匪浅。首先,由于毕业设计所用的PHP技术和其中用到HTML等前端语言是在课堂上从来都没有接触过的,所以要用它来做设计,必须通过前期大量自学来掌握,因而在这个过程中,不仅大大提高了我的自学能力而且让我对PHP的学习有了进一步的认识。做自己喜欢的事情,效率永远是最高的。在此次毕业设计的过程遇到了很多的困难,我求教了不少老师和同学,同时也学会了怎么利用互联网的便利快捷来找到自己所需要的学习资料。在这个过程中让我体会到了,学习交流的重要性。
通过实践证明,经测试运行。本次设计所制作的系统基本符合界面友好、使用灵活、操作简单、功能齐全等功能,而前台所采用的Ecshop的view模板的在国内的流行程度,可以从侧面反应此购物商城系统的广大的发展市场。
在毕业论文过程中,得到了老师指导跟同学的帮助。在此特别感谢指导老师王和兴老师的悉心指导,并且在此向给我提供过帮助的同学表示感谢。
特别是在论文的前期,对论文以及开发方向毫无头绪的时候,王和兴老师给我指明了学习的方向的道路。在结合我的兴趣的基础上,给我指明了php学习的方向,及时从迷茫中走出了出来,在前期枯燥的学习中,王和兴老师及时的督促跟严谨的教学作风,让我在万事开头难的学习开始阶段中慢慢找到了学习的乐趣跟快感。并慢慢在其中找到了一种成就感。所以在此答辩之际,特别向王老师表示衷心的感谢跟崇高的敬意。