基于JavaWeb实现洋酒销售平台的设计与实现

作者主页:编程千纸鹤

作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师

主要内容:Java项目开发、Python项目开发、大学数据和AI项目开发、单片机项目设计、面试技术整理、最新技术分享

收藏点赞不迷路  关注作者有好处

文末获得源码

项目编号:BS-PT-057

前言:

随着洋酒与中国市场的相互适应以及电子商务和网上商店的普及,洋酒类商品的网上展示与订购逐渐成为主流,如今洋酒不仅仅是贵族身份的象征,也渐渐进入了寻常百姓家。网上商店的技术实现同时也成为了一个比较常见的课题。本文就网上商店的实现做了一些研究。

此设计主要采用JSP开发技术和mysql数据库技术来开发,根据实际需求构建了基于SSH(Struts+Spring+Hibernate)整合框架的电子商务系统,深入了解了轻量级Java EE应用体系结构。最后实现了一个网上购物系统,该系统分为前台和后台,前台主要功能包括普通会员用户的注册和登录、商品浏览、个人信息管理、购物车、查看订单,后台主要功能包括系统管理员信息管理、用户信息管理、商品管理、商品一级二级分类管理、订单管理。本文详细阐述了整个销售系统的设计思路,并对各部分设计进行了详尽的分析,最终形成了一个完整的设计方案。

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:JavaWeb

二,项目简介

2.1 背景介绍

随着信息技术的不断发展,人们的生活发生了巨大的变化,特别是在因特网出现之后将世界变得越来越小。电子商务的出现使传统商务模式遭受到巨大的冲击。一种基于浏览器/服务器结构模式,实现了网上购物,在线交易的崭新的运营模式。电子商务在中国发展了一段时间,目前我国国内也有许多电商的平台,经过分析,国内的电子商务网站做的都是综合型,一个平台中几乎各个方面的商务领域都有涉及到。像一些比较流行的网购平台,如:京东商城,淘宝网,拍拍网,涉及的类型很多,分类只是模糊分类而已,并不是特别细致,就洋酒而言,种类特别多,所以更需要单独创建一个平台,可以给消费者提供更多更好的选择。

随着中国经济的不断发展,人民生活水平有所提高,中产阶级和白领继续扩大,中国奢侈品消费形成了较大的市场,特别是沿海经济发达地区的奢侈消费甚至超过有欧美国家的势头。 然而洋酒的消费是商品中最多的奢侈品消费。

本系统采用SSH(Struts+Spring+Hibernate)框架来进行开发。SSH框架是当前J2EE领域里最流行而且较为成熟的开源框架,它是以MVC设计模式为基础,降低了程序的耦合性,提高了应用程序的复用性、移植性、灵活性、扩展性和应用性能。SSH轻量级开发框架相对于EJB开发框架,同时继承了其优势,而且在开发和实现中的效率已经有相当程度的提高。

2.2 功能需求

网站前台功能

  1. 首页:提供一个网站首页,在上面显示网站企业LOGO,用户的登录,用户的注册,一级分类显示,最新商品及热门商品显示等。
  2. 用户的注册:主要针对未注册的用户,完成注册功能使用,在注册过程中,需要进行数据的前台非空校验,及使用AJAX完成用户名是否存在的异步校验。在校验通过后即可完成注册,在后台同样需要进行数据校验及发送一封激活邮件。
  3. 用户的登录:已经注册的用户,可输入正确的用户名和密码进行登录。
  4. 用户的退出:针对已经登录的用户,退出该系统使用。
  5. 首页商品展示:显示最新商品及热门商品。方便用户了解最新以及最热门商品。
  6. 分类页面商品展示:根据某个分类的信息去展示商品。可以方便用户查找相应分类商品。
  7. 商品详情展示:点击某个具体商品的时候,可以显示商品的详情。以便用户可以方便的了解商品的具体信息。
  8. 购物车:此功能为用户提供购物功能,用户可以根据自己需要,将自己需要购买的商品添加到购物车,也可以移除购物车中的商品,甚至清空购物车中的所有东西。
  9. 订单:登录用户可以将自己喜欢商品进行购买,产生订单。可以对自己产生的订单进行提交。以及可以根据用户信息,查询自己的订单。

网站后台功能

  1. 管理员登录:管理员根据用户名和密码完成登录功能。
  2. 一级分类管理:对前台的一级分类进行管理。
  3. 二级分类管理:对前台的二级分类进行管理。
  4. 商品管理:管理员可以对前台上显示的商品进行管理包括添加,修改,删除,查询的功能操作同时要可以上传商品的图片。
  5. 订单管理:管理员可以对所有的用户产生的订单进行管理包括未付款的,已经付款的,已经发货的,交易完成的订单。可以修改订单状态及异步加载订单项。
  6. 用户管理:管理员可以对注册过的用户进行管理。  

根据软件需求分析,将洋酒销售系统分为两大模块:前台销售模块和后台管理模块。前台销售模块包括3部分:(1)注册登录模块:用户在前台可以进行注册、登录;(2)产品分类模块:用户可以选择产品分类,然后进行相应的产品选择。(3)购物车模块。

后台管理模块,包括如下几个部分:系统管理、商品分类管理、商品信息管理、订单管理、会员用户管理。

网上洋酒销售系统的系统总体功能结构如图1所示:

三,系统展示

5.1  主页面

主页面是网上洋酒销售系统的门户,所以主页面设计的好坏直接影响到整个销售系统的形象。首页所载的内容有:销售系统工具栏,包括我的订单,购物车,新用户注册,会员用户登录等一些列选项;导航列包括首页以及一级分类属性,还包括新品推荐,热卖推荐。效果如图5-1所示。

图5-1 系统主界面

5.2  用户登录注册及前台模块设计

5.2.1  用户登录

用户进入主页面,若想点击浏览最上方的销售系统工具栏或者进行购买必须先登录。点击右上角登录进入登录界面。在会员登陆模块输入正确的用户名与密码后,点击“登陆”按钮即可进入登录页面,如图5-2所示。该模块在用户登录要进行用户名和密码的有效性检验,查询用户表。如果该用户存在则跳转到系统首页,同时可以选择用户退出,如图5-3所示。如果不能登录成功则给予提示,用户名不存在或者密码有误,以提示用户再次输入正确的用户名及密码登陆。

   图5-2 用户登录界面

   

 

图5-3 登录成功后界面                            

5.2.2  用户注册

如果用户是首次访问系统,还未注册过,可以单击顶端工具栏的【新用户注册】按钮或左侧的会员登录模块里的【新用户注册】按钮进入新用户注册界面,进行用户注册。这是用户全面能够使用系统功能的通道,是必不可少的部分。效果如图5-4所示。

图5-4用户注册界面

5.2.3  产品分类

      这里是系统人性化的一个体现,显示的是商城里洋酒的具体分类。如图5-5所示,是一级分类,这里已经添加了三个分类,分别是白兰地,威士忌,金酒,伏特加,朗姆酒,特吉拉酒。具体分类的增删改可以在后台管理模块实现。如图5-6所示,是二级分类,根据一级分类分出的二级分类。

图5-5产品一级分类界面

图5-6产品二级分类界面

     

5.2.4  热门商品

这里是为客户专门定制的一个模块,为用户主动推荐热门产品,让用户可以在首页就能看到商场为顾客推荐的热门产品。具体推荐的增删改可以在后台管理模块实现。如图5-7所示:

图5-7特别推荐界面

5.2.5  最新商品

              这里显示的是商城里最新上架的商品。可以让顾客及时了解到新品的情况。具体新品的增删改可以在后台管理模块实现。如图5-8所示:

图5-8最新上架界

5.3 后台管理模块的设计与实现

后台的设计完全是为了前台服务的,前台主要是展现,所以后台必须有支持前台的功能。后台的维护功能主要包括如下:系统管理、商品分类管理、商品管理、订单管理、注册用户管理。

5.3.1  后台管理系统

5.3.1.1  系统管理员登陆模块

管理员的登陆入口在另一个页面,管理员的账号和密码是数据库里默认已预先存入数据库的,用户名cjh,密码1231。输入完毕无错误提示,点击“登陆”按钮进入后台管理系统。界面如图5-9所示。

图 5-9 后台管理系统登陆界面

后台系统管理员登陆模块主要代码:

5.3.2  系统后台管理

管理员登陆进入后系统台管理模块,如图5-10所示是管理员首先看到的页面:  

图5-10 后台管理页面

      系统后台管理分类为以下模块:注册用户管理,一级分类管理,二级分类管理,商品管理,订单管理。

5.3.2.1  注册用户管理

注册用户管理包括序号,用户名,真实姓名,编辑以及删除。

点击编辑后如图5-11所示:

图 5-11编辑用户

5.3.2.2  一级分类管理

这个模块的功能是管理首页上的导航模块上的一级分类部分,可添加新分类,具有编辑,删除,添加三个操作按钮。如图5-12所示:

图 5-12 一级分类管理

5.3.2.3  二级商品管理

这个模块的功能是管理点导航模块上的一级分类部分时出现的二级分类部分,二级分类是依据一级分类为前提的。可添加新分类,具有编辑,删除,添加三个操作按钮。如图5-13所示:

图 5-13 二级分类管理

5.3.2.4  商品管理

       这个模块的功能是对商品进行管理的,可以查看商品的图片,名称价格,是否热门和进行编辑。如图5-14所示:

图 5-14 商品管理

5.3.2.5  订单管理

       这个模块的功能是管理用户订单信息。包括订单的编号,收货人以及订单详情等。如图5-15所示:

图 5-15订单管理

四,核心代码展示

package cn.itbaizhan.shop.adminuser.action;

import org.apache.struts2.ServletActionContext;

import cn.itbaizhan.shop.adminuser.service.AdminUserService;
import cn.itbaizhan.shop.adminuser.vo.AdminUser;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class AdminUserAction extends ActionSupport implements
		ModelDriven<AdminUser> {
	// 模型驱动使用的对象
	private AdminUser adminUser = new AdminUser();

	public AdminUser getModel() {
		return adminUser;
	}

	// 注入AdminUserService
	private AdminUserService adminUserService;

	public void setAdminUserService(AdminUserService adminUserService) {
		this.adminUserService = adminUserService;
	}

	// 后台登录的执行的方法
	public String login() {
		// 调用service方法完成登录
		AdminUser existAdminUser = adminUserService.login(adminUser);
		// 判断
		if (existAdminUser == null) {
			// 用户名或密码错误
			this.addActionError("用户名或密码错误!");
			return "loginFail";
		} else {
			// 登录成功:
			ServletActionContext.getRequest().getSession()
					.setAttribute("existAdminUser", existAdminUser);
			return "loginSuccess";
		}
	}
}
package cn.itbaizhan.shop.cart.action;

import org.apache.struts2.ServletActionContext;

import cn.itbaizhan.shop.cart.vo.Cart;
import cn.itbaizhan.shop.cart.vo.CartItem;
import cn.itbaizhan.shop.product.service.ProductService;
import cn.itbaizhan.shop.product.vo.Product;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 购物车Action
 */
public class CartAction extends ActionSupport {
	// 接收pid
	private Integer pid;
	// 接收数量count
	private Integer count;
	// 注入商品的Service
	private ProductService productService;

	public void setProductService(ProductService productService) {
		this.productService = productService;
	}

	public void setPid(Integer pid) {
		this.pid = pid;
	}

	public void setCount(Integer count) {
		this.count = count;
	}

	// 将购物项添加到购物车:执行的方法
	public String addCart() {
		// 封装一个CartItem对象.
		CartItem cartItem = new CartItem();
		// 设置数量:
		cartItem.setCount(count);
		// 根据pid进行查询商品:
		Product product = productService.findByPid(pid);
		// 设置商品:
		cartItem.setProduct(product);
		// 将购物项添加到购物车.
		// 购物车应该存在session中.
		Cart cart = getCart();
		cart.addCart(cartItem);

		return "addCart";
	}

	// 清空购物车的执行的方法:
	public String clearCart(){
		// 获得购物车对象.
		Cart cart = getCart();
		// 调用购物车中清空方法.
		cart.clearCart();
		return "clearCart";
	}
	
	// 从购物车中移除购物项的方法:
	public String removeCart(){
		// 获得购物车对象
		Cart cart = getCart();
		// 调用购物车中移除的方法:
		cart.removeCart(pid);
		// 返回页面:
		return "removeCart";
	}
	
	// 我的购物车:执行的方法
	public String myCart(){
		return "myCart";
	}
	
	/**
	 * 获得购物车的方法:从session中获得购物车.
	 * @return
	 */
	private Cart getCart() {
		Cart cart = (Cart) ServletActionContext.getRequest().getSession()
				.getAttribute("cart");
		if (cart == null) {
			cart = new Cart();
			ServletActionContext.getRequest().getSession()
					.setAttribute("cart", cart);
		}
		return cart;
	}
}
package cn.itbaizhan.shop.order.action;

import java.io.IOException;
import java.util.Date;

import org.apache.struts2.ServletActionContext;

import cn.itbaizhan.shop.cart.vo.Cart;
import cn.itbaizhan.shop.cart.vo.CartItem;
import cn.itbaizhan.shop.order.service.OrderService;
import cn.itbaizhan.shop.order.vo.Order;
import cn.itbaizhan.shop.order.vo.OrderItem;
import cn.itbaizhan.shop.user.vo.User;
import cn.itbaizhan.shop.utils.PageBean;
import cn.itbaizhan.shop.utils.PaymentUtil;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 * 订单Action类
 */
public class OrderAction extends ActionSupport implements ModelDriven<Order> {
	// 模型驱动使用的对象
	private Order order = new Order();

	public Order getModel() {
		return order;
	}

	// 接收支付通道编码:
	private String pd_FrpId;

	public void setPd_FrpId(String pd_FrpId) {
		this.pd_FrpId = pd_FrpId;
	}
	// 接收付款成功后的参数:
	private String r3_Amt;
	private String r6_Order;
	
	public void setR3_Amt(String r3_Amt) {
		this.r3_Amt = r3_Amt;
	}

	public void setR6_Order(String r6_Order) {
		this.r6_Order = r6_Order;
	}

	// 接收page
	private Integer page;

	public void setPage(Integer page) {
		this.page = page;
	}

	// 注入OrderService
	private OrderService orderService;

	public void setOrderService(OrderService orderService) {
		this.orderService = orderService;
	}

	// 生成订单的执行的方法:
	public String saveOrder() {

		// 调用Service完成数据库插入的操作:
		// Order order = new Order();
		// 设置订单的总金额:订单的总金额应该是购物车中总金额:
		// 购物车在session中,从session总获得购物车信息.
		Cart cart = (Cart) ServletActionContext.getRequest().getSession()
				.getAttribute("cart");
		if (cart == null) {
			this.addActionMessage("亲!您还没有购物!");
			return "msg";
		}
		order.setTotal(cart.getTotal());
		// 设置订单的状态
		order.setState(2); // 1:未付款.
		// 设置订单时间
		order.setOrdertime(new Date());
		// 设置订单关联的客户:
		User existUser = (User) ServletActionContext.getRequest().getSession()
				.getAttribute("existUser");
		if (existUser == null) {
			this.addActionMessage("亲!您还没有登录!");
			return "msg";
		}
		order.setUser(existUser);
		// 设置订单项集合:
		for (CartItem cartItem : cart.getCartItems()) {
			// 订单项的信息从购物项获得的.
			OrderItem orderItem = new OrderItem();
			orderItem.setCount(cartItem.getCount());
			orderItem.setSubtotal(cartItem.getSubtotal());
			orderItem.setProduct(cartItem.getProduct());
			orderItem.setOrder(order);

			order.getOrderItems().add(orderItem);
		}
		orderService.save(order);
		// 清空购物车:
		cart.clearCart();

		// 页面需要回显订单信息:
		// 使用模型驱动了 所有可以不使用值栈保存了
		// ActionContext.getContext().getValueStack().set("order", order);

		return "saveOrder";
	}

	// 查询我的订单:
	public String findByUid() {
		// 获得用户的id.
		User existUser = (User) ServletActionContext.getRequest().getSession()
				.getAttribute("existUser");
		// 获得用户的id
		Integer uid = existUser.getUid();
		// 根据用户的id查询订单:
		PageBean<Order> pageBean = orderService.findByUid(uid, page);
		// 将PageBean数据带到页面上.
		ActionContext.getContext().getValueStack().set("pageBean", pageBean);
		return "findByUid";
	}

	// 根据订单id查询订单:
	public String findByOid() {
		order = orderService.findByOid(order.getOid());
		return "findByOid";
	}

	// 为订单付款:
	public String payOrder() throws IOException {
		// 1.修改数据:
		Order currOrder = orderService.findByOid(order.getOid());
		currOrder.setAddr(order.getAddr());
		currOrder.setName(order.getName());
		currOrder.setPhone(order.getPhone());
		// 修改订单
		orderService.update(currOrder);
		this.addActionMessage("亲!提交成功!");
		return "msg";
	}

	// 付款成功后跳转回来的路径:
	public String callBack(){
		// 修改订单的状态:
		Order currOrder = orderService.findByOid(Integer.parseInt(r6_Order));
		// 修改订单状态为2:已经付款:
		currOrder.setState(2);
		orderService.update(currOrder);
		this.addActionMessage("支付成功!订单编号为: "+r6_Order +" 付款金额为: "+r3_Amt);
		return "msg";
	}
	
	// 修改订单的状态:
	public String updateState(){
		Order currOrder = orderService.findByOid(order.getOid());
		currOrder.setState(4);
		orderService.update(currOrder);
		return "updateStateSuccess";
	}
}

五,项目总结

随着计算机技术的发展,使得网络的应用更加广泛。加大信息网络的建设,开展网络交易平台,进行网络交易服务等将成为未来网络建设的具体内容,而网上销售系统平台的出现,能极大的提升大众对于购物的体验。

JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与各种Web服务器,应用服务器,浏览器和开发工具共同工作。因此本论坛采用JSP技术开放能满足这种需求。

论文中详细讨论了网上洋酒销售系统的设计思想,包括系统体系结构的设计、系统功能模块设计、数据库设计、系统的实现等。根据软件设计和实现的情况,重点阐述了系统实现过程中功能模块设计、数据库设计、组件的设计、前台显示部分设计、后台维护部分设计等关键设计。

到论文截稿时,网上洋酒销售系统已通过运行测试,基本完成预期目标的实现。能够达到在线浏览,购买商品,基本满足了大众电脑购买的需求。

网上电脑销售系统在设计和实现过程中,系统从不可用,到可用运行,从字符乱码,到正常的中文显示。一次次的改进,这使本人认识到设计、算法在系统开发中的重要性和理论与实践相结合的重要性。

但由于系统开发的经验不足,水平有限,所以目前此系统的实现上还有许多地方可以进一步改善和提高。

网上洋酒销售系统只是实现了网上销售系统的基本功,同能时由于是第一次编写此类系统,还有很多比较流行的功能,如:用户数据分析,相关产品推荐,模糊查询等都尚未实现,在算法的采用和数据库逻辑的设计上还存在一些不完善的地方。

在经过几个月的努力,我最终顺利完成了网上电脑销售系统的软件开发。在整个开发过程中,我不仅学会了使用MyEclipse,Mysql等一系列开发工具,体验了开发过程中的苦与乐,而且也达到了锻炼自己的目的,同时进一步加深对软件开发工作的理解和认识。可谓是收获颇丰。

猜你喜欢

转载自blog.csdn.net/BS009/article/details/132617082