摘要
【摘要】
所谓电子商务就是在网上开展商务活动,当企业将它的主要业务通过企业内部网(Intranet)、外部网(Extranet)以及Internet与企业的职员、客户供销商以及合作伙伴直接相连时,其中发生的各种活动就是电子商务。电子商务是基于Internet或局域网、广域网、包括了从销售、市场到商业信息管理的全过程。本系统的开发正符合了这一要求。论文中详细阐述了系统的设计目标、总体架构及各功能模块的详细设计。
【关键词】 电子商务 电子商务网站 电子商务系统
目录
摘要 1
0 引言 1
1 系统分析 2
1.1 需求分析 2
1.2 可行性分析 2
2 总体设计 2
2.1 项目规划 2
2.2 系统功能结构图 2
3 系统设计 3
3.1 设计目标 3
3.2 开发及运行环境 4
3.3 数据库设计 4
4 JavaBean的编写 5
4.1 数据库操作的JavaBean的编写 5
4.2 字符串处理的JavaBean的编写 8
4.3 商品JavaBean的编写 9
4.4 保存购物信息的JavaBean的编写 9
4.5 对商品信息操作的接口的JavaBean的编写 10
4.6 对商品信息操作的JavaBean的编写 10
5 网站前台主要功能模块设计 11
5.2 网站前台首页设计 11
5.3 特价商品模块设计 13
5.4 新品上架模块设计 14
5.5 商品分类模块设计 15
5.6 会员管理模块设计 16
5.7 销售排行模块设计 25
附录A 参考文献
附录B 数据表
附录C 文件架构图
0 引言
随着中国市场经济的日趋成熟,中国企业面对的竞争压力也越来越大,企业要想生存,就必须充分利用信息化手段来提高管理效率及市场响应速度。电子商务是在互联网开放的网络环境下,基于浏览器/服务器应用方式,实现消费者的网上购物、商户之间的网上交易和在线电子支付的一种新型的商业运营模式。电子商务做为一种独立的经济形态,已初具规模,一些电子商务网站的成立,给人们的生活带来了巨大的影响。
如何建立企业的电子商务,如何把企业业务建在Internet上,涉及到建立电子商务网站、开发符合Internet特点的有效的业务应用、管理网上的交易信息、保证网上数据安全、快速反映市场变化以及充分满足Internet业务进一步发展的要求等等。对一个运营商业企业来说,电子商务网站是其生存的理由和基础,同时也是企业对外展示信息、从事商务活动的窗口和界面。如何设计、建立一个经济、实用、安全、高效、稳定的网站是每个电子商务网站必须考虑的问题。
而要解决好这些问题,就必须在提高企业内部管理效率、充分利用企业内部资源的基础上,从整体上降低成本,加快对市场的响应速度,提高服务质量,提高企业的竞争力。但是企业在利用信息化技术时,必须要考虑成本、技术难度、创造的价值等几个方面。
1 系统分析
1.1 需求分析
通过对一些典型电子商务网站的考察、分析以及实际的市场调查,要求本系统具有以下功能:
统一友好的操作界面,能保证系统的易用性。
规范、完善的基础信息设置。
商品分类详尽,可按不同类别查看商品信息。
按商品大类及商品名称进行模糊查询。
实现网上购物。
新品及特价商品展示。
商品销售排行。
1.2 可行性分析
商业企业在运营过程中,经常会受到以下一些条件的限制:
产品的宣传受到限制,采购商或顾客只能通过上门咨询、电话沟通等方式进行各种信息的获取,受一定的时间与物理空间的局限并且成本较高。
庞大的商业经济周转。
复杂的产品周转渠道。从看样品、谈价格到支付货款等一系列的产品周转渠道过于复杂,企业与顾客之间缺乏全面的沟通与快捷运营的平台。
商业企业中根据季节的变化,热销商品在销售高峰到来时货源紧张,企业需要实时了解商品的销售情况,保证热销商品的要货满足率。
因此,企业需要重新认识市场、消费者以及自身市场定位,正确认识电子商务技术在企业中的重要地位,以少量的时间和资金建立企业信息门户网站并架设一定范围的商务网络,以此来制定长远发展战略,使企业与顾客间的经济活动变得更灵活、更主动。
2 总体设计
2.1 项目规划
电子商务系统是一个典型的JSP数据库开发应用程序,由前台商品展示及销售、后台管理2部分组成。
前台商品展示及销售
该部分主要包括新品上架、特价商品、销售排行、购物车、会员管理、商品公告及订单查询、商品查询等。
后台管理
该部分主要对商城内的一些基础数据进行有效管理,包括商品管理、会员管理、订单管理、公告管理等。
2.2 系统功能结构图
电子商务系统前台功能结构如图1所示。
图1 系统前台功能结构图
电子商务系统后台功能结构如图2所示。
图2 系统后台功能结构图
3 系统设计
3.1 设计目标
本系统在设计时应该满足以下几个目标:
采用人机对话的操作方式,界面设计美观友好、信息查询灵活、方便、快捷、准确、数据存储安全可靠。
全面展示商城内所有商品,并可展示最新商品及特价商品。
为顾客提供一个方便、快捷的商品信息查询功能。采用模糊查询查询数据。
会员可以随时修改自己的会员资料。
实现网上购物。
商品销售排行,以方便顾客了解本商城内的热销商品及帮助企业领导者做出相应的决策。
查看商城内的公告信息。
用户随时都可以查看自己的订单。
对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
系统最大限度地实现了易维护性和易操作性。
系统运行稳定、安全可靠。
3.2 开发及运行环境
硬件平台:
CPU:P41.8GHz;
内存:256MB以上。
软件平台:
操作系统:Windows 2000 Server;
数据库:SQL Server 2000;
开发工具包:JDK Version1.4.2;
JSP服务器:Tomcat 5.0;
浏览器:IE5.0及以上版本,推荐使用IE6.0;
分辨率:最佳效果1024×768。
3.3 数据库设计
本系统数据库采用SQL Server 2000数据库,系统数据库名称为db_shop,共包含9张表。关于数据库中的数据表请参见附录B。
4 JavaBean的编写
根据系统的需求编写需要的JavaBean。下面将给出Go购电子商城中所需要的JavaBean的编写过程。
4.1 数据库操作的JavaBean的编写
数据库操作的JavaBean是一个公共类,通常包括连接数据库的方法getConnection、执行查询语句的方法executeQuery、执行更新操作的方法executeUpdate、关闭数据库连接的方法close。下面将给出编写Go购电子商城中的数据库操作的JavaBean“connDB”的实现过程。
(1)指定JavaBean“connDB”保存的包,并导入所需的类包,并将其保存到“com.wgh.DB”包中,代码如下:
package com.wgh.DB; //将该类保存到com.wgh.DB包中
import java.sql.; //导入提供基本的数据库编程服务的包
import java.io.; //导入提供与设备无关的输入、输出流支持的包
import java.util.*; //导入提供实用方法和数据结构的类包
(2)在构造方法connDB中定义该类中所需的变量。通常将方法中常用的变量均放在构造方法中。构造方法connDB的代码如下:
public class connDB {
public Connection conn = null; //定义一个Connection对象
public Statement stmt = null; //定义一个Statement对象
public ResultSet rs = null; //定义一个ResultSet对象
private static String propFileName = “C:/connDB.properties”; //定义保存properties文件的路径的静态变量
private static Properties prop = new Properties(); //创建一个Properties对象的实例并实例化该对象
private static String dbClassName =
“com.microsoft.jdbc.sqlserver.SQLServerDriver”; //保存驱动类的类名的变量
private static String dbUrl =
“jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_shop”;//保存连接数据库的URL地址的变量
private static String dbUser = “sa”; //保存SQL Server登录用户名的变量
private static String dbPwd = “”; //保存SQL Server登录密码的变量
(3)为了方便程序移植,我将数据库连接所需信息保存到properties文件中。connDB.properties文件的内容如下:
#DB_CLASS_NAME(驱动的类的类名)=com.microsoft.jdbc.sqlserver.SQLServerDriver
DB_CLASS_NAME=com.microsoft.jdbc.sqlserver.SQLServerDriver
#DB_URL(要连接数据库的地址)=jdbc(JDBC模式):microsoft(谁提供的):sqlserver(产品)😕/localhost:1433(SQL SERVER默认端口);DatabaseName=db_database
DB_URL=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_shop
#DB_USER=sa拥护名字
DB_USER=sa
#DB_PWD(用户密码)=
DB_PWD=
定义loadProperty方法读取properties文件中的数据库连接所需信息。读取数据库连接所需信息时,可能发生异常,因此需要捕获这个异常。loadProperty方法的代码如下:
private static void loadProperty() {
try {
prop.load(new FileInputStream(propFileName)); //通过文件输入流对象加载Properties文件
dbClassName = prop.getProperty(“DB_CLASS_NAME”); //读取驱动类的类名
dbUrl = prop.getProperty(“DB_URL”,
“jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_shop”); //读取数据库的URL地址
dbUser = prop.getProperty(“DB_USER”, “sa”); //读取SQL Server登录用户名
dbPwd = prop.getProperty(“DB_PWD”, “”); //读取SQL Server登录密码
}
catch (Exception e) {
e.printStackTrace();
}
}
(4)创建连接数据库的方法getConnection,该方法返回Connection对象的一个实例。getConnection方法的代码如下:
public static Connection getConnection() {
Connection conn = null;
loadProperty(); //通过loadProperty方法读取properties文件中的数据库连接所需信息
try {
Class.forName(dbClassName).newInstance(); //调用Class的forName方法加载驱动程序
conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
}
catch (Exception ee) {
ee.printStackTrace();
}
if (conn == null) {
System.err.println(
“警告: DbConnectionManager.getConnection() 获得数据库链接失败.\r\n\r\n链接类型:” +
dbClassName + “\r\n链接位置:” + dbUrl + “\r\n用户/密码” + dbUser + “/” +
dbPwd);
}
return conn;
}
(5)创建执行查询语句的方法executeQuery,返回值为ResultSet结果集。executeQuery方法的代码如下:
public ResultSet executeQuery(String sql) {
try {
conn = getConnection(); //调用getConnection()方法构造Connection对象的一个实例conn
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
}
catch (SQLException ex) {
System.err.println(ex.getMessage());
}
return rs;
}
(6)创建执行更新操作的方法executeUpdate,返回值为int型的整数,代表更新的行数。executeQuery方法的代码如下:
public int executeUpdate(String sql) {
int result = 0;
try {
conn = getConnection(); //调用getConnection()方法构造Connection对象的一个实例conn
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
result = stmt.executeUpdate(sql); //执行更新操作
}
catch (SQLException ex) {
result = 0;
}
try {
stmt.close(); //关闭Statement对象
}
catch (SQLException ex1) {
}
return result;
}
(7)创建执行更新操作,并返回该操作中自动编号字段的自动编号的方法executeUpdate_id。executeUpdate_id方法的代码如下:
public int executeUpdate_id(String sql) {
int result = 0;
try {
conn = getConnection(); //调用getConnection()方法构造Connection对象的一个实例conn
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
result = stmt.executeUpdate(sql);
String ID = “select @@IDENTITY as id”;
rs = stmt.executeQuery(ID);
if (rs.next()) {
int autoID = rs.getInt(“id”);
result = autoID;
}
}
catch (SQLException ex) {
result = 0;
}
return result;
}
(8)创建关闭数据库连接的方法close。close方法的代码如下:
public void close() {
try {
if (rs != null) {
rs.close(); //关闭ResultSet结果集
}
}
catch (Exception e) {
e.printStackTrace(System.err);
}
try {
if (stmt != null) {
stmt.close(); //关闭Statement
}
}
catch (Exception e) {
e.printStackTrace(System.err);
}
try {
if (conn != null) {
conn.close(); //关闭Connection
}
}
catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
4.2 字符串处理的JavaBean的编写
字符串处理的JavaBean是解决程序中经常出现的有关字符串处理问题的方法的类。包括将数据库中及页面中有中文问题的字符串进行正确的显示和存储的方法chStr和将字符串中的回车换行、空格及HTML标记符正确显示的方法convertStr两个方法。下面是编写Go购电子商城中的字符串处理的JavaBean“chStr”的详细过程。
(1)编写解决输出中文乱码问题的方法chStr。chStr方法的代码如下:
public String chStr(String str){
if(strnull){
str=“”;
}else{
try{
str=(new String(str.getBytes(“iso-8859-1”),“GB2312”)).trim();
}catch(Exception e){
e.printStackTrace(System.err);
}
}
return str;
}
(2)编写显示文本中的回车换行、空格及保证HTML标记的正常输出的方法convertStr。convertStr方法的代码如下:
public String convertStr(String str1){
if(str1null){
str1=“”;
}else{
try{
str1=str1.replaceAll(“<”,“<”);
str1=str1.replaceAll(“>”,“>”);
str1=str1.replaceAll(" “,” “);
str1=str1.replaceAll(”\r\n",“
”);
}catch(Exception e){
e.printStackTrace(System.err);
}
}
return str1;
}
4.3 商品JavaBean的编写
商品JavaBean就是对商品实体的抽象,它包含了商品实体的所有属性及商品对象的初始化构造的方法。
package commerce;
public class goods {
private Integer ID=Integer.getInteger(“-1”); //商品ID号
private int typeID=-1; //商品类别ID
private String goodsName=“”; //商品名称
private String introduce=“”; //商品简介
private float price=(float)0.0; //商品定价,此处必须强制类型转换
private float nowPrice=(float)0.0; //商品现价,此处必须强制类型转换
private String picture=“”; //商品图片
private int newGoods=-1; //是否为新品
private int sale=-1; //是否特价
public void goods(){ //商品类的构造方法,此方法不能省略
}
public Integer getID(){ //获取商品ID
return ID;
}
public void setID(Integer ID){ //设置商品ID
this.ID=ID;
}
…… //此处省略了控制商品信息其他属性的属性接口的代码
public int getSale() { //获取商品是否为特价商品
return sale;
}
public void setSale(int sale) { //设置商品是否为特价商品
this.sale = sale;
}
}
4.4 保存购物信息的JavaBean的编写
保存购物信息的JavaBean主要在实现购物车时应用,在类中定义商品的属性。保存购物信息的JavaBean“goodselement”的代码如下:
package commerce;
public class goodselement {
public int ID; //商品ID
public float nowprice; //现价
public int number; //数量
}
4.5 对商品信息操作的接口的JavaBean的编写
对商品信息操作的接口的JavaBean的代码如下:
package com.wgh.dao;
import commerce.goods; //导入商品JavaBean
public interface GoodsDao {
public int insert(goods g); //定义插入方法
public int update(goods g); //定义更新方法
public int delete(goods g); //定义删除方法
}
4.6 对商品信息操作的JavaBean的编写
对商品信息操作的JavaBean实现了GoodsDao接口中对商品信息添加的方法insert、修改的方法update、删除的方法delete。对商品信息操作的JavaBean“GoodsDaoImpl”的代码如下:
package com.wgh.dao;
import commerce.goods; //导入商品JavaBean
import com.wgh.DB.chStr; //导入字符串处理的JavaBean
import com.wgh.DB.connDB; //导入数据库操作的JavaBean
public class GoodsDaoImpl implements GoodsDao { //声明GoodsDaoImpl类使用的接口
connDB conn = new connDB(); //实例化connDB类的一个对象
chStr chStr = new chStr(); //实例化connDB类的一个对象
public int insert(goods g) {
int ret = -1;
try {
String sql = “Insert into tb_goods
(TypeID,GoodsName,Introduce,Price,nowPrice,picture,newgoods,sale) values(” +
g.getTypeID() + “,'” + chStr.chStr(g.getGoodsName()) + “‘,’” +
chStr.chStr(g.getIntroduce()) + “',” + g.getPrice() + “,” +
g.getPrice() + “,'” + chStr.chStr(g.getPicture()) + “',” +
g.getNewGoods() + “,” + g.getSale() + “)”;
ret = conn.executeUpdate(sql); //执行更新操作
}
catch (Exception e) {
ret = 0;
}
conn.close();
return ret;
}
public int update(goods g) { //实现GoodsDao 接口中的update方法,对商品数据表进行更新操作
int ret = -1;
try {
String sql = “update tb_Goods set TypeID=” +g.getTypeID() +
“,GoodsName='” + chStr.chStr(g.getGoodsName()) + “‘,introduce=’” +
chStr.chStr(g.getIntroduce()) + “',price=” + g.getPrice() +
“,nowprice=” + g.getNowPrice() +“,picture='” + chStr.chStr(g.getPicture())+ “',newgoods=” +
g.getNewGoods() + “,sale=” + g.getSale() + " where ID=" + g.getID();
ret = conn.executeUpdate(sql); //执行更新操作
}
catch (Exception e) {
ret = 0;
}
conn.close();
return ret;
}
public int delete(goods g) { //实现GoodsDao接口中的delete方法,对商品数据表进行删除操作
int ret=-1;
try{
String sql=“Delete from tb_goods where ID=”+g.getID();
ret=conn.executeUpdate(sql);
}catch(Exception e){
ret=0;
}
conn.close(); //关闭数据库的连接
return ret;
}
}
5 网站前台主要功能模块设计
5.2 网站前台首页设计
在Go购电子商城的首页中,用户不但可以在第1时间内掌握商城推出的特价商品、上架新品、最新公告等,还可以查看销售排行、搜索指定商品、商品分类查询等。Go购电子商城前台首页的运行结果如图4所示。
图4 网站前台首页的运行结果
下面以列表形式给出前台页面各部分的说明信息,如表1所示。
表1 前台页面说明
区域 名称 说明 对应文件
1 网站导航 主要展示网站的旗帜广告和站内导航条 navigation.jsp
2 用户登录 主要用于会员登录和提供会员注册的入口 left.jsp
3 商品搜索 主要用于按商品的大分类模糊查询商品信息 search.jsp
4 商城公告 主要用于显示网站最新公告 left.jsp
5 特价商品 用于显示最新的两条特价商品的信息 index.jsp
6 商品分类 按类别展示商品信息 right.jsp
7 销售排行 显示商城中销售量最好的10种商品 left.jsp
8 商品上架 主要用于显示最新上架的4种商品信息 index.jsp
9 广告招商位 用于显示网站的广告招商信息 right.jsp
10 后台登录入口 网站后台登录入口 copyright.jsp
11 版权信息 显示网站版权信息 copyright.jsp
5.3 特价商品模块设计
特价商品模块共有两个入口,一个是网站导航条中的【特价商品】导航按钮,另一个是网站前台的居中位置,分栏列出了商城中特价商品中最新的两条特价商品信息,单击特价商品展区中的“More…”超链接可以进入到特价商品页面,在该页面中将列出商城中的全部特价商品。主要包括商品图片、名称、原价、现价等信息。同时设置了【购买】按钮和【详细信息】按钮,分别用于将商品信息添加至购物车和查看商品详细信息。特价商品模块在网站首页的设计效果如图5所示。
图5 特价商品模块在网站首页的设计效果
(1)查询数据表中的特价商品。特价商品信息同商品基本信息同时保存在商品信息表tb_goods中,以字段sale标识,当sale字段的值为1时,代表该商品为特价商品。在网站首页中查询特价商品的代码如下:
<%@ page import=“com.wgh.DB.connDB” %>
<%connDB conn=new connDB(); //创建并实例化connDB的一个对象
ResultSet rs_sale=conn.executeQuery
(“select top 2 ID,GoodsName,price,nowprice,picture from tb_goods where sale=1 order by INTime desc”);%>
特价商品页面sale.jsp中查询特价商品的代码如下:
<%@ page import=“com.wgh.DB.connDB” %>
<%connDB conn=new connDB();
ResultSet rs=conn.executeQuery
(“select ID,GoodsName,Introduce,price,nowprice,picture from tb_goods where sale=1 order by GoodsName”);
(2)制作显示特价商品信息部分。在网站首页中显示特价商品信息采用了分栏技术,也就是应用if语句结合求模运算符实现在一个单元格中同时显示两列数据。关键代码如下:
<%int s=1;
while (rs_sale.next()){
sale_ID=rs_sale.getInt(1);
s_goodsname=rs_sale.getString(2);
s_price=rs_sale.getFloat(3);
s_nowprice=rs_sale.getFloat(4);
s_picture=rs_sale.getString(5);
if(s%2==1){
%>
…… //此处省略显示商品信息的代码
<%}else{%>
图6 新品上架模块在网站首页中的设计效果
新品上架信息同商品基本信息同时保存在商品信息表tb_goods中,以字段newGoods标识,当newGoods字段的值为1时,代表该商品为上架新品。在网站首页中查询新上架商品的代码如下:
<%@ page import=“com.wgh.DB.connDB” %>
<%connDB conn=new connDB();
ResultSet rs_new=conn.executeQuery(“select top 4 ID,GoodsName,nowprice,introduce,picture from tb_goods where newGoods=1 order by INTime desc”); %>
5.5 商品分类模块设计
为了方便用户查询所需商品信息,在网站中设置了商品分类显示模块。在网站首页的右侧以树状菜单的形式列出了商品的大、小分类信息,用户单击大类别结点可以显示出该类的所有小类信息,单击小类结点可以进入到分类商品显示页面查看该类别的全部商品信息,在分类商品显示页面中,单击商品名称可以查看相应商品的详细信息。如果用户已经登录,还可以直接将商品信息添加至购物车中。商品分类模块的页面设计效果如图7所示。
图7 商品分类模块的页面设计效果
实现以树状菜单的形式显示商品的大、小分类信息的关键是获取商品的大分类信息,并分别查询出每个大类所对应的小分类信息,再通过
<%@ page import=“com.wgh.DB.connDB” %>
<%connDB conn=new connDB();
ResultSet rs_superType=conn.executeQuery(“select ID,superType from V_Type group by ID,superType order by superType desc”);%>
…… //此处省略了部分HTML代码
<%int ID_superType=0;
String superType=“”;
int m=1;
while(rs_superType.next()){
ID_superType=rs_superType.getInt(1);
superType=rs_superType.getString(2);
String sql=“select * from V_Type where ID=”+ID_superType;
ResultSet rs_subType=conn.executeQuery(sql);
String subType=“”;
int subID=0;
rs_subType.last();
int subType_RC=rs_subType.getRow();
rs_subType.first();%>
<%if(subType_RC<=0){%>
![](images/jian_null.gif)
<%=superType%>
<%}else{ %>
![展开](images/jia.gif)
<%=superType%>
<%} %>
<%if (subType_RC>0){%>
<%do{
subType=rs_subType.getString(3);
subID=rs_subType.getInt(4);
%>
…… //此处省略了页面布局的HTML代码
<% m++; //注意,该条语句一定不能少
}while(rs_subType.next());%>
<%}%>
<% }%>
5.6 会员管理模块设计
在前台的会员管理模块中主要包括会员注册、会员登录、会员资料修改3部分。由于会员资料修改同会员注册的实现方法类似,只是调用的SQL语句不同,所以此处只给出会员注册和会员登录进行介绍。
1.会员注册
会员注册的入口位于网站首页的左侧。用户单击【注册】按钮即可进入到会员注册页面,该页面的设计效果如图8所示。
图8 会员注册页面设计效果
会员注册模块由两个页面组成,一个是用于收集用户输入的注册信息的会员注册页面,另一个用于将会员注册信息保存到数据表中的处理页。
会员注册页面主要由表单元素组成,比较简单。
将会员注册信息保存到数据表中,首先使用JavaBean中的member类保存客户端输入的会员信息,再通过调用memberDaoImpl中的insert方法将会员信息保存到会员信息表中。在保存会员信息时,还需要判断会员名是否存在,必须保证会员名称的惟一性。保存会员信息的完整代码如下:
<%@ page import=“com.wgh.DB.connDB”%>
<%@ page import=“com.wgh.dao.MemberDaoImpl” %>
<jsp:useBean id=“member” scope=“request” class=“commerce.member”>
<jsp:setProperty name=“member” property=“*”/> //一次性为JavaBean的所有属性赋值
</jsp:useBean>
<%connDB conn=new connDB();
request.setCharacterEncoding(“gb2312”); //编码转换
String username=member.getUsername();
ResultSet rs=conn.executeQuery(“select * from tb_Member where username='”+username+“'”);
if (rs.next()){
out.println(“”);
}
}%>
2.会员登录
会员登录用于网站会员登录本网站进行购物或查看订单情况。会员登录入口位于网站首页的左侧,页面运行结果如图4所示。下面给出会员登录页面的设计效果图和会员登录后的会员登录页面的运行结果,分别如图9、图10所示。
图9 会员登录页面的设计效果 图10 会员登录后的会员登录页面的运行结果
当用户在登录窗口中输入用户名和密码后,单击【登录】按钮,系统将对输入的用户名和密码进行验证,如果用户输入的用户名存在并且冻结字段的值不为1,则判断用户输入的密码是否正确,如果密码正确,则重新进入网站首页,显示登录用户的用户名、【修改资料】按钮、【退出登录】按钮,否则提示登录失败。会员登录页面的关键代码如下:
<%@ page import=“com.wgh.DB.connDB”%>
<%@ page import=“com.wgh.DB.chStr”%>
<%connDB conn=new connDB(); //创建并实例化connDB的一个对象
chStr chStr=new chStr(); //创建并实例化chStr的一个对象
String username=chStr.chStr(request.getParameter(“username”));//此处必须进行编码转换,否则输入中文用户名时将出现乱码
try{
ResultSet rs=conn.executeQuery(“select * from tb_Member where username='”+username+“’ and freeze=0”);
if(rs.next()){
String PWD=request.getParameter(“PWD”);
if(PWD.equals(rs.getString(“password”))){ //判断用户输入的密码是否正确
session.setAttribute(“username”,username); //为session变量username赋值
response.sendRedirect(“index.jsp”); //将页面重定向到index.jsp页面
}else{
out.println(“”);
}
conn.close(); //关闭相关连接%>
5.7 销售排行模块设计
用户单击网站导航条中的“销售排行”超链接,将进入到销售排行页面,销售排行页面的设计效果如图13所示。
图13 销售排行页面设计效果
销售排行页面主要是将订单视图中的数据按GoodsName、GoodsID字段分组并统计销售数量,再按统计后的销售数量降序排列,最后再使用SQL语句中的top关键字取出销售量最高的前10种商品。关键代码如下:
<%@ page import=“com.wgh.DB.connDB” %>
<%connDB conn=new connDB();
String username=(String)session.getAttribute(“username”);
ResultSet rs=conn.executeQuery(“select top 10 GoodsID,GoodsName, sum(number) as sumNum from V_order_detail group by GoodsName,GoodsID order by sumNum desc”);
int goodsID=-1;
String goodsName=“”;
%>
商品销售排行页面运行结果如图14所示。
图14 商品销售排行页面运行结果
附录A 参考文献
1.JSP数据库系统开发完全手册 人民邮电出版社 2006年3月
2.Delphi数据库系统开发完全手册 人民邮电出版社 2006年3月
3.Visual Basic数据库系统开发完全手册 人民邮电出版社 2006年3月
4.Visual C++数据库系统开发完全手册 人民邮电出版社 2006年3月
5.JSP 信息系统开发实例精选 机械工业出版社 王国辉、牛强、李南南等 2005年7月
6.Visual Basic信息系统开发实例精选 机械工业出版社 宋坤、赵智勇、刘强等 2005年7月
7.SQL Server数据库开发实例解析 机械工业出版社 宋昆、李严等 2006年1月
8.Access数据库开发实例解析 机械工业出版社 李俊民、高春燕等 2006年1月
9.Visual Basic精彩编程200例 机械工业出版社 赛奎春、高春艳等 2003年1月
10.ASP数据库开发实例解析 机械工业出版社 李严、于亚芳、王国辉 2004年12月
11.Delphi工程应用与项目实践 机械工业出版社 宋坤、赵智勇等 2005年1月
12.Visual Basic工程应用与项目实践 机械工业出版社 高春艳、李俊民等 2005年1月
13.Visual C++工程应用与项目实践 机械工业出版社 张雨、阮伟良等 5005年1月
14.JSP工程应用与项目实践 机械工业出版社 陈威、白伟明、李楠 2005年2月
15.ASP工程应用与项目实践 机械工业出版社 王国辉、牛强、李南南 2005年4月
16.Visual Basic 信息系统开发实例精选 机械工业出版社 高春艳、李俊民、张耀庭等
2005年7月
17.ASP 信息系统开发实例精选 机械工业出版社 王国辉、牛强、李南南等 2005年7月
18.Delphi 信息系统开发实例精选 机械工业出版社 宋坤、赵智勇、刘强等 2005年7月
19.Visual foxpro数据库开发关键技术与实例应用 人民邮电出版社 周桓、张雨、王国辉 2004年5月
20.PoweBuilder数据库开发关键技术与实例应用 人民邮电出版社 刘志铭 张振坤 冯文萃 2004年5月
21.Delphi数据库开发关键技术与实例应用 人民邮电出版社 赛奎春 陈紫鸿 2004年5月
22.Visual basic数据库开发关键技术与实例应用 人民邮电出版社 高春艳、李艳 2004年5月
23.Visual C++ 管理信息系统完整项目实例剖析 人民邮电出版社 明日科技 2005年7月
24.Visual Basic 管理信息系统完整项目实例剖析 人民邮电出版社 明日科技 2005年7月
25.PowerBuilder 管理信息系统完整项目实例剖析 人民邮电出版社 明日科技 2005年7月
26.Visual FoxPro管理信息系统完整项目实例剖析 人民邮电出版社 明日科技 2005年7月
27.Delphi数据库开发实例解析 机械工业出版社 赛奎春、郑骁鹏等 2004年2月
28.Visual Basic数据库开发实例解析 机械工业出版社 刘志铭、高春艳等 2003年8月
29.Visual FoxPro数据库开发实例解析 机械工业出版社 王晶莹、王国辉等 2003年9月
30.Power Builder数据库开发实例解析 机械工业出版社 华传铭、张振坤等 2003年9月
31.PowerBuilder 精彩编程200例 机械工业出版社 张振坤、李文立等 2004年9月
32.Visual FoxPro 精彩编程200例 机械工业出版社 王国辉、董韶华等 2004年9月
附录B 数据表
(1)tb_superType(商品大分类信息表)
商品大分类信息表主要用来保存商品类别中大的类别信息。表tb_superType的结构如表B.1所示。
表B.1 表tb_superType的结构
字段名 数据类型 长度 是否主键 描述
id int 4 是 类别ID
TypeName varchar 50 类别名称
(2)tb_subType(商品小分类信息表)
商品小分类信息表主要用来保存商品类别中小的类别信息。表tb_subType的结构如表B.2所示。
表B.2 表tb_subType的结构
字段名 数据类型 长度 是否主键 描述
ID int 4 是 类别ID
superType int 4 父类ID
TypeName varchar 50 类别名称
(3)tb_rebate(折扣表)
折扣表用来保存顾客在购买商品时的折扣信息。表tb_rebate的结构如表B.3所示。
表B.3 表tb_rebate的结构
字段名 数据类型 长度 是否主键 描述
grade varchar 20 是 等级
Amount money 8 消费额
rebate float 8 折扣
(4)tb_order_detail(订单明细表)
订单明细表用来保存订单的详细信息。表tb_order_detail的结构如表B.4所示。
表B.4 表tb_order_detail的结构
字段名 数据类型 长度 是否主键 描述
ID bigint 8 是 ID号
orderID bigint 8 与tb_Order表的OrderID字段关联
goodsID bigint 8 商品ID
price money 8 价格
number int 4 数量
(5)tb_order(订单信息主表)
订单信息主表用来保存订单的概要信息。表tb_order的结构如表B.5所示。
表B.5 表tb_order的结构
字段名 数据类型 长度 是否主键 描述
OrderID bigint 8 是 订单编号
bnumber smallint 2 品种数
username varchar 15 用户名
Truename varchar 15 真实姓名
address varchar 100 联系地址
postcode varchar 10 邮政编码
tel varchar 20 电话
pay varchar 20 付款方式
carry varchar 20 运送方式
rebate float 8 折扣
OrderDate smalldatetime 4 订货日期
enforce int 4 是否执行
bz varchar 200 备注
(6)tb_member(会员信息表)
会员信息表主要用来存储所注册的会员的信息。表tb_member的结构如表B.6所示。
表B.6 表tb_member的结构
字段名 数据类型 长度 是否主键 描述
ID int 4 是 会员ID
userName varchar 20 用户名
trueName varchar 20 真实姓名
passWord varchar 20 密码
city varchar 20 所在城市
address varchar 100 联系地址
postcode varchar 6 邮政编码
cardNO varchar 24 证件号码
cardType varchar 20 证件类型
grade int 4 等级
Amount money 8 消费额
tel varchar 20 电话
email varchar 100 Email地址
freeze int 4 是否冻结
(7)tb_manager(管理员信息表)
管理员信息表用来保存管理员信息。表tb_manager的结构如表B.7所示。
表B.7 表tb_manager的结构
字段名 数据类型 长度 是否主键 描述
ID int 4 是 ID号
manager varchar 30 管理员名称
PWD varchar 30 密码
(8)tb_goods(商品信息表)
商品信息表主要用来保存商品信息。表tb_goods的结构如表B.8所示。
表B.8 表tb_goods的结构
字段名 数据类型 长度 是否主键 描述
ID bigint 8 是 商品ID
typeID int 4 类别ID
goodsName varchar 200 商品名称
introduce text 16 商品简介
price money 8 定价
nowPrice money 8 现价
picture varchar 100 图片文件
INTime datetime 8 录入时间
newGoods int 4 是否新品
sale int 4 是否特价
hit int 4 浏览次数
(9)tb_BBS(公告信息表)
公告信息表主要用来保存商城的公告信息。表tb_BBS的结构如表B.9所示。
表B.9 表tb_BBS的结构
字段名 数据类型 长度 是否主键 描述
ID int 4 是 ID号
title varchar 100 公告标题
content varchar 4000 0 公告内容
INTime datetime 8 录入时间
附录C 文件架构图
前台首页架构图及导航栏架构如图C.1所。
图C.1 前台首页及导航栏架构图
左侧页面架构图及购物车架构图如图C.2所示。
图C.2 左侧页面及购物车架构图
网站后台文件架构如图C.3所示。
图C.3 网站后台文件架构图