资源描述
课 程 设 计
课程名称___数据库 __________
题目名称___网上购书系统_______
学生学院____计算机____________
专业班级
学 号
学生姓名
指导教师_______左亚尧________
2012年 1 月 16 日
1 引言 3
1.1课程设计选题 4
1.2 课程设计的目的 4
1.3 本选题的背景 4
2 系统分析和设计 4
2.1 功能及性能分析 4
2.1.1 功能需求 4
2.1.2 性能需求 4
2.1.3 数据流图 5
2.2 系统的开发环境 5
2.3 系统的总体设计 6
3 数据库设计 6
3.1 数据库概念结构 7
3.1.1 数据库中各表的数据描述如下: 7
3.1.2 E-R图(各表ER图关系) 9
3.2 数据库逻辑结构 10
3.2.1 关系模型及优化 10
3.2.2 视图的设计 10
3.3 数据库的实现 10
3.3.1 表 10
3.3.2 安全性设计 11
3.3.3 一般性设计 11
4 详细设计与实现 14
4.1 文件目录结构设计及说明 14
4.2 注册模块程序说明 15
4.3 登录模块程序说明 15
4.4 购物车模块说明 16
4.5 书籍管理模块 18
结论 21
参考文献 21
1 引言
1.1课程设计选题
《网上购书系统》
1.2 课程设计的目的
通过数据库系统课程设计,熟悉了Mysql数据库管理系统的结构与组成;掌握了Mysql数据库管理系统的应用技术和的使用;应用ASP开发工具实践了《在线考试系统》的数据库应用系统的设计方法、开发过程和SQL SERVER数据库的管理与维护。最终达到掌握数据库管理系统的使用和开发,提高分析问题、解决问题和实践应用能力。
1.3 本选题的背景
随着互联网的普及和发展,电子商务在互联网的潮流中扮演着重要的角色,改变着人们的日常生活情况。网上购物不仅是一种潮流也是对人们的生活有巨大的的便利。我们不乏看到许多的百货的电子商务商城,本课程设计是设计一个网上购书系统,让买书在互联网进行。
2 系统分析和设计
2.1 功能及性能分析
2.1.1 功能需求
主要功能需求主要有:
l 产品(书籍)管理:主要是书籍的管理,管理书籍的名称、书籍介绍、价格等,主要是管理员有此权限。
l 订单管理:主要功能是把会员通过网站订购的产品,以列表的形式展示出来,并且能够修改记录的状态,来区分未结算订单和结算订单之间的状态。
l 会员管理:主要包括会员注册、登录等,以及会员登录后提供的结算功能。令会员有购物车管理的功能。
l 商品搜索:提供搜索框,给予搜索功能。主要根据用户输入的关键字,搜索与关键字匹配的产品名称和介绍。
2.1.2 性能需求
数据一致性:一旦管理员增加了书籍在商品库中,会员能够实时的看到,体现数据的一致性。用户增加到购物车的书籍要实时增加,购物车中的书籍一旦经过结算应当改变相应的状态。
2.1.3 数据流图
网上购书系统整体流图如下:
2.2 系统的开发环境
开发平台与运行环境:Windows7 + PHP5.4.3 + Mysql5.5.24 + Apache2.2.22
2.3 系统的总体设计
总体布局和框架
各个功能设计流程图略。
以下为网站包含文件(共13个文件夹和14PHP应用脚本程序,详细在详细设计中给出)
3 数据库设计
3.1 数据库概念结构
3.1.1 数据库中各表的数据描述如下:
Ø 产品数据表(o_product):产品数据表用于记录管理员上传的产品信息,有产品名称,产品介绍,市场价,商城价。如下:
字段
数据类型
长度
NULL
默认值
字段说明
id
int
4
Not null
Auto_increment
产品编号 自增
title
varchar
200
null
产品名称
intro
text
null
产品介绍
price
int
6
Null
市场价格
mprice
int
6
null
商城价格
fileid
varchar
200
null
附件id
commend
varchar
10
null
推荐
images
varchar
200
null
图片名称
Ø 产品附件数据表(o_files):产品附件数据库,用于保存与产品相关的图片文件信息。
字段
数据类型
长度
NULL
默认值
字段说明
id
int
4
Not null
Auto_increment
编号 自增主键
fileid
varchar
200
null
产品id
filetitle
varchar
255
null
附件标题
filename
varchar
200
Null
文件名称
filetype
varchar
200
null
文件类型
Ø 会员数据表(o_members):会员数据表,用于记录网站会员的登录,以及姓名、电话、地址等信息。
字段
数据类型
长度
NULL
默认值
字段说明
id
int
4
Not null
Auto_increment
会员编号自增主
email
varchar
200
null
注册email
password
varchar
255
null
会员密码
nickname
varchar
100
Null
昵称
truename
varchar
100
null
真实姓名
sex
int
4
null
性别
telphone
varchar
100
null
固定电话
mobile
varchar
100
null
移动电话
address
text
null
通讯地址
admin
int
4
null
是否为管理员
Ø 订单数据表(o_order):会员结算后,产生的购物清单保存在订单数据表中,便于管理人员查看会员已经购买的物品。
字段
数据类型
长度
NULL
默认值
字段说明
id
int
4
Not null
Auto_increment
订单编号自增主
pid
int
4
null
产品id
mid
int
4
null
会员id
price
int
6
Null
价格
number
Int r
4
null
数量
total
int
6
null
总价
over
int
4
null
是否购买
3.1.2 E-R图(各表ER图关系)
3.2 数据库逻辑结构
3.2.1 关系模型及优化
所有的表都是自增主键ID,所以都符合3NF,无需另外优化
3.2.2 视图的设计
无视图设计
3.3 数据库的实现
3.3.1 表
该系统共设置了四个表目,各表目结构如下:
Ø 产品数据表(o_product):产品数据表用于记录管理员上传的产品信息,有产品名称,产品介绍,市场价,商城价。
Ø 产品附件数据表(o_files):产品附件数据库,用于保存与产品相关的图片文件信息。
Ø 会员数据表(o_members):会员数据表,用于记录网站会员的登录,以及姓名、电话、地址等信息。
Ø 订单数据表(o_order):会员结算后,产生的购物清单保存在订单数据表中,便于管理人员查看会员已经购买的物品。
3.3.2 安全性设计
权限的设置,只有管理员有插入新图书的权限。
3.3.3 一般性设计
主要是对数据库表的两种完整性进行设计:
实体完整性:通过设置主键都已实现。
参照完整性:产品数据表与产品附件数据表相联系,插入、删除、和更新数据都要同步,会员表和订单表相联系
建表主要代码:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- 数据库:'onlinestort'
--
-- --------------------------------------
--
-- 表的结构:'o_product'
--
CREATE TABLE `o_product` (
`id` int(4) NOT NULL auto_increment,
`title` varchar(200) default NULL,
`intro` text,
`price` int(6) default NULL,
`mprice` int(6) default NULL,
`fileid` varchar(200) default NULL,
`commend` varchar(10) default 'NO',
`images` varchar(200) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
--
-- 表的结构:'o_files'
--
CREATE TABLE `o_files` (
`id` int(4) NOT NULL auto_increment,
`fileid` varchar(200) default NULL,
`filetitle` varchar(255) default NULL,
`filename` varchar(200) default NULL,
`filetype` varchar(100) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- 表的结构'o_members'
--
CREATE TABLE `o_members` (
`id` int(4) NOT NULL auto_increment,
`email` varchar(200) default NULL,
`password` varchar(200) default NULL,
`nickname` varchar(100) default NULL,
`truename` varchar(100) default NULL,
`sex` int(4) default NULL,
`telphone` varchar(100) default NULL,
`mobile` varchar(100) default NULL,
`address` text,
`admin` int(4) default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- 表的结构 'o_order'
--
CREATE TABLE `o_order` (
`id` int(4) NOT NULL auto_increment,
`pid` int(4) default NULL,
`mid` int(4) default NULL,
`price` int(6) default NULL,
`number` int(4) default NULL,
`total` int(6) default NULL,
`over` int(4) default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
4 详细设计与实现
4.1 文件目录结构设计及说明
根目录下包含17个对象,三个文件夹和14个PHP应用脚本程序。
Index.php:网站首页
Cart.php:购物车程序
Global.php:全局配置文件,数据库配置等
Login.php:登录认证程序
Product.php:书籍列表程序
Regiseter.php:用户注册
Search.php:书籍搜索
Store.php:书籍详情页面
User.php:用户密码修改
User_order.php:用户订单管理
User_product.php:用户书籍管理
User_product_upload.php:书籍图片上传程序
Class:核心类程序文件夹
Folder:书籍图片上传文件夹
Templates:页面模板文件存放文件夹
网站首页:
4.2 注册模块程序说明
用户点击首页导航注册按钮,则会跳转到regiseter.php页面,填写表单进行注册,这时与会员数据表(o_member)进行交互,如果没有出现用户名重名,邮箱重复使用等情况则可通过注册。如下图:
4.3 登录模块程序说明
用户点击首页导航登录按钮,进入登录页面,输入登录邮箱和密码,如果邮箱和密码与会员数据表的数据相符则会提示登录成功,并跳转到修改密码页面。如下图
登录成功后:
4.4 购物车模块说明
用户在书籍列表中选择书籍后进入书籍详细页,选择放入购物车按钮,书籍进入用户购物车页面内。购物车模块有结算功能,用户在购物车页面的书籍复选框中选择商品勾选,勾选完毕后即可点击结算按钮。
代码:
<?php
session_start ();
include 'global.php';
//获取以GET方法传递到本页的数据
if (isset ( $_GET ["id"] )) {
$g->setSql ( "select id,title,mprice from #_product where fileid = '" . strval ( $_GET ["id"] ) . "'" );
$p = NULL;
$g->loadObject ( $p );
$cart->addItem ( $p->id, $p->title, 1, $p->mprice );
}
//获取以POST方法传递到本页的数据
if (isset ( $_POST ["do"] )) {
switch ($_POST ["do"]) {
case "cart" :
if (count ( $_POST ["cid"] ) > 0) {
foreach ( $_POST ["cid"] as $v ) {
$g->setSql ( "select id,title,mprice from #_product where id = '" . $v . "'" );
$p = NULL;
$g->loadObject ( $p );
$cart->addItem ( $p->id, $p->title, 1, $p->mprice );
}
}
break;
case "delete":
if(count($_POST["cid"])>0){
foreach($_POST["cid"] as $v){
$cart->removeItem($v);
}
}
break;
case "order" :
if(isset($_SESSION["i"])){
$cartArray = $cart->listArray();
if(count($_POST["cid"])>0){
$total = 0;
foreach($_POST["cid"] as $id){
$order = "";
$order["pid"] = $cartArray[$id]["id"];
$order["mid"] = $_SESSION["i"]["id"];
$order["price"] = $cartArray[$id]["price"];
$order["number"] = $cartArray[$id]["number"];
$sprice = $cartArray[$id]["price"]*$cartArray[$id]["number"];
$order["total"] = $sprice;
$g->insertObject("#_order",$order);
$total += $sprice;
}
//清空购物车数据
$cart->clear();
//显示结算数据,并返回首页
$g->alert("结算成功,共计费用:".$total."元","index.php",5);
}else{
$g->alert("请选择确定购买的产品","cart.php",1);
}
}else{
$g->alert("注册用户请 <a href='login.php'>登录</a> 后再进行结算,非注册用户请 <a href='register.php'>注册</a> 后再登录。","login.php",5);
}
break;
}
}
?>
4.5 书籍管理模块
书籍管理模块涉及到产品数据表和产品附件数据表的操作,书籍管理模块为会员管理表admin 表项为1的用户拥有。用于管理上传图书信息,插入产品数据表和产品附件数据表。
如下图:
用例:增加一本叫做《人人都是产品经理》的书:
效果如下:
代码:
<?php
//表单处理代码
if(isset($_POST["do"])){
$action = strval($_POST["do"]);
$error = "";
switch($action){
case "addProduct":
$f = $_POST;
if($f["title"]==""){
$error .= "书籍名称不能为空<br>";
}
$g->setSql("select id from #_product where title = '".$f["title"]."'");
$g->query();
if($g->getLines()>0){
$error .= "产品已经存在<br>";
}
if($error==""){
/*****创建文件夹代码开始****/
$path =
$pathSign = "/";
$path = "folder/".$uid."/".date("Y")."/".date("m")."/".date("d");
$dirArray = explode ( $pathSign, $path."/thumbnail" );
$tempDir = '';
foreach ( $dirArray as $dir ) {
$tempDir .= $dir . $pathSign;
$isFile = file_exists ( $tempDir );
clearstatcache ();
if (! $isFile && ! is_dir ( $tempDir )) {
@mkdir ( $tempDir, 0777 );
}
}
/******创建文件夹代码结束***/
$p["title"] = $f["title"];
$p["intro"] = $f["intro"];
$p["price"] = $f["price"];
$p["mprice"] = $f["mprice"];
$p["fileid"] = md5(time().$uid);
$p["commend"] = $f["commend"];
$p["images"] = $path;
$g->insertObject("#_product",$p);
$g->alert('添加书籍成功','user_product.php',1);
}else{
$g->alert($error,'user_product.php');
}
break;
case "delete":
if(count($_POST["cid"])>0){
foreach($_POST["cid"] as $k=>$v){
$g->setSql("delete from #_product where id = '".$v."'");
$g->query();
}
echo '删除成功';
}else{
echo '请选择要删除的记录';
}
break;
case "commend":
if(count($_POST["cid"])>0){
foreach($_POST["cid"] as $k=>$v){
$g->setSql("update #_product set commend = 'YES' where id = '".$v."'");
$g->query();
}
echo '推荐成功';
}else{
echo '请选择要上传图片的记录';
}
break;
case "upload":
if(count($_POST["cid"])>0){
$upid = end($_POST["cid"]);
$g->setSql("select fileid from #_product where id = '".$upid."'");
$g->query();
$up = $g->loadRow();
echo '<script>window.location.href="user_product_upload.php?upid='.$up[0].'";</script>';
}else{
echo '请选择要推荐的记录';
}
break;
}
}
?>
<!---------产品列表开始--------->
<?php
$header = array("ID","书籍名称","市场价","商城价","推荐");
$g->setSql("select id,title,price,mprice,commend from #_product");
$g->query();
$data = $g->loadRowList(1);
$toolbar = array(
"delete" =>array("value"=>"删除","action"=>""),
"commend" =>array("value"=>"推荐","action"=>""),
"upload" =>array("value"=>"上传图片","action"=>"user_product_upload.php")
);
echo $table->normal($header,$data,true,$toolbar);
?>
结论
本网站是网上购书系统,我是参照网上购物系统来做的,经过测试,还有一个写Bug存在,比如在上传书籍图片上存在问题,会出现图片上传成功,缩略图的转化还不成功的情况,具体原因还有待debug。另外一个问题就是结算后出现的页面产生乱码,理想状态是应该显示结算成功,并给出结算金额,这都有待接下来的继续探索。这次课程设计操作采用了PHP+Mysql的模式,收获很多,了解到了数据库功能的强大,能支撑起一个系统的流畅运行。虽然数据库的设计有固定的步骤,不过我还是认为要灵活使用各个步骤,做到敏捷的开发。我想在这次课设的原型上继续完善系统,做一个大学城的图书分享网站的设计。希望能借此继续加强自己的数据库设计能力。
参考文献
[1] 潘凯华,刘中华. PHP 开发实战1200例(第一卷). 清华大学出版社,2011.01
[2] Ryan stephens,Ron Plew,Arie D.Jones著,王 崧 等译. 轻松掌握SQL 第五版.电子工业出版社,2009.10
19
展开阅读全文