外设购物平台

目 录

一、系统分析

二、系统设计

[2.1 系统功能设计](#2.1 系统功能设计)

[2.2 数据库设计](#2.2 数据库设计)

三、系统实现

[3.1 注册功能](#3.1 注册功能)

[3.2 登录功能](#3.2 登录功能)

[3.3 分页查询所有商品信息功能](#3.3 分页查询所有商品信息功能)

[3.4 分页条件(精确、模糊)查询商品信息功能](#3.4 分页条件(精确、模糊)查询商品信息功能)

[3.5 购物车功能](#3.5 购物车功能)

[3.6 订单管理功能](#3.6 订单管理功能)

四、项目总结

一、系统分析

在构建一个高效、稳定且用户友好的外设商城系统时,我们需要充分利用各种技术工具来确保系统的顺利运行。其中,HTML、CSS、JSP、Java和JDBC等技术的结合应用,为我们构建这样的系统提供了坚实的基础。

首先,HTML和CSS是构建前端界面的关键工具。它们共同协作,以呈现一个美观且易于导航的商城界面。HTML负责构建页面的基本结构,包括商品列表、详情页、购物车等关键部分的布局。而CSS则负责为这些页面添加样式,如颜色、字体、图片等,以增强用户的视觉体验。通过这些技术,我们可以为外设产品打造一个丰富多样的展示平台,吸引用户的眼球。

其次,JSP技术在动态页面生成方面发挥着重要作用。当用户点击某个商品或进行搜索时,JSP能够根据用户的请求动态生成相应的页面内容。这使得商品详情页、促销信息页等能够实时更新,展示最新的产品信息。此外,JSP还能够与数据库进行交互,获取商品数据并展示在页面上,为用户提供更加个性化的购物体验。

在后端处理方面,Java作为核心编程语言,承担着处理业务逻辑的重要任务。例如,订单管理、库存更新、用户认证等功能都需要通过Java来实现。Java具有强大的功能性和稳定性,能够确保商城系统的正常运行。同时,Java还拥有丰富的库和框架,可以帮助我们快速开发并优化系统性能。

为了实现与数据库的高效连接,我们采用了JDBC技术。JDBC提供了一种标准的方式,使Java程序能够与各种数据库进行通信。通过JDBC,我们可以方便地存储和管理外设产品数据,如商品信息、库存数量、订单记录等。这确保了商城系统的数据一致性和完整性,为用户提供了可靠的购物保障。

此外,基于MVC分层思想,我们采用了Servlet作为控制器,协调前端和后端的交互。MVC模式将应用程序划分为模型、视图和控制器三个层次,有助于实现代码的分离和复用。Servlet作为控制器,负责接收用户的请求并调用相应的业务逻辑进行处理。然后,Servlet将处理结果传递给视图层进行展示。这种分层设计使得商城系统的结构更加清晰,易于维护和扩展。

综上所述,通过HTML、CSS、JSP、Java和JDBC等技术的综合运用,我们可以构建一个功能强大、性能稳定且用户友好的外设商城系统。该系统能够为用户提供丰富的外设产品展示、便捷的购物流程和良好的购物体验,为外设销售商提供有力的支持。

系统设计

2.1 系统功能设计

本系统具备一套全面而完善的功能体系,旨在为用户提供更加便捷、高效和安全的在线购物体验。这些功能不仅丰富了系统的应用场景,还提升了用户的使用体验。

首先,本系统设置了用户注册与登录功能,以确保用户身份的合法性和安全性。用户可以通过简单的注册流程,创建自己的账号,并设置相应的密码。在登录时,系统会进行身份验证,确保只有合法的用户才能进入系统。这一功能有效地保护了用户的隐私和数据安全,让用户能够放心地使用本系统。

其次,本系统提供了分页查询所有商品信息功能。用户可以轻松浏览系统中的所有商品,通过分页的方式查看商品的详细信息,包括名称、价格、图片等。这一功能为用户提供了一个便捷的浏览平台,帮助他们快速找到自己感兴趣的商品。

除了分页查询,本系统还具备分页条件查询商品信息功能。用户可以根据精确或模糊的条件,如商品名称、价格范围、品牌等,进行商品的查找。这一功能大大提高了用户筛选商品的效率,使他们能够更精确地找到符合自己需求的商品。

购物车功能是本系统的重要组成部分。用户可以将心仪的商品添加到购物车中,方便统一管理。购物车支持修改商品数量、删除商品等操作,为用户提供了极大的便利。同时,购物车还具备自动计算总价的功能,帮助用户清晰地了解购物金额。

最后,本系统还具备订单管理功能,以保障交易流程的顺畅进行。用户可以在系统中查看自己的订单信息,包括订单状态、支付情况、发货情况等。系统还提供订单确认、支付、发货等环节的提示和提醒功能,确保用户能够及时了解订单的进展情况。

功能模块图:

图 2-1 功能图

综上所述,本系统具备完善的功能体系,旨在为用户提供全面、高效和安全的在线购物体验。通过注册与登录、分页查询、条件查询、购物车和订单管理等功能的配合,本系统能够满足用户在不同场景下的需求,提升用户的购物体验。

2.2 数据库设计

  1. address 表:包含地址相关信息,如用户编号(Userld)、街道(Street)、省份(Province)、邮政编码(PostalCode)、电话(Phone)和名称(Name)。

表2.1-1address 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| id | int | 地址记录的编号 |
| Userld | int | 用户编号 |
| Street | varchar | 街道名称 |
| Province | varchar | 省份名称 |
| PostalCode | varchar | 邮政编码 |
| Phone | varchar | 电话号码 |
| Name | varchar | 名称 |

  1. commoditys 表:有关商品的信息,包括编号(id)、标题(Title)、企业(Enterprise)、出版商编号(Publisherld)、出版日期(PublishDate)、国际标准书号(ISBN)、目录(TOC)、类别编号(Categoryld)等。

表2.1-2commoditys 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| id | int | 商品编号 |
| Title | varchar | 商品标题 |
| Enterprise | varchar | 企业名称 |
| Publisherld | int | 出版商编号 |
| PublishDate | 日期型 | 出版日期 |
| ISBN | varchar | 国际标准书号 |
| TOC | varchar | 目录 |
| Categoryld | int | 商品类别编号 |
| Clicks | 整数型 | 点击量 |

  1. pics 表:可能与图片相关,有公司编号(firm ld)和名称(Name)。

表2.1-3pics 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| firm ld | int | 公司编号 |
| Name | varchar | 公司名称 |

  1. manufacturer 表:记录制造商的信息,如编号(ld)和名称(Name)。

表2.1-4manufacturer 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| ld | int | 制造商编号 |
| Name | varchar | 制造商名称 |

  1. ordercommodity 表:涉及订单商品的详情,包括编号(Id)、订单编号(OrderlD)、商品编号(CommoditylD)、数量(Quantity)、单价(UnitPrice)。

表2.1-5ordercommodity 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| Id | int | 订单商品记录编号 |
| OrderlD | int | 订单编号 |
| CommoditylD | int | 商品编号 |
| Quantity | int | 数量 |
| UnitPrice | float | 单价 |

  1. orders 表:关于订单的表,包含订单编号(id)、订单日期(OrderDate)、用户编号(Userld)、总价(TotalPrice)。

表2.1-6orders 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| id | int | 订单编号 |
| OrderDate | 日期型 | 订单日期 |
| Userld | int | 用户编号 |
| TotalPrice | float | 订单总价 |

表2.1-7userroles 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| ld | int | 用户角色编号 |
| Name | varchar | 用户角色名称 |

  1. users 表:用户的详细信息,如编号(id)、登录名(Loginld)、登录密码(LoginPwd)、名称(Name)、地址(Address)、电话(Phone)、邮件(Mail)、用户角色编号(UserRoleld)、用户状态编号(UserStateld)。

表2.1-8users 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| id | int | 用户编号 |
| Loginld | varchar | 登录名 |
| LoginPwd | varchar | 登录密码 |
| Name | varchar | 用户名称 |
| Address | varchar | 地址 |
| Phone | varchar | 电话 |
| Mail | varchar | 邮箱 |
| UserRoleld | int | 用户角色编号 |
| UserStateld | int | 用户状态编号 |

  1. userstates 表:定义用户状态,有编号(ld)和状态名称(Name)。

表2.1-9userstates 表

|-------------|--------------|------------|
| 字段名 | 数据类型 | 描述 |
| ld | int | 用户角色编号 |
| Name | varchar | 状态名称 |

三、系统实现

3.1 注册功能

用户通过填写必要信息进行注册,系统进行有效性验证后完成注册流程。

网页截图:

图3-1注册

3.2 登录功能

文字描述:用户输入账号密码进行登录,通过验证后进入系统,并利用 cookie 和 session 保持登录状态,同时通过过滤器进行登录权限验证。

网页截图:

图3-2登录

3.3 分页查询所有商品信息功能

文字描述:能够分页展示所有商品信息,方便用户逐页查看。

网页截图:

3.4 分页条件(精确、模糊)查询商品信息功能

文字描述:用户可根据具体条件进行精确或模糊分页查询商品。

网页截图:

图3-4查询

3.5 购物车功能

文字描述:用户可将商品添加到购物车,对购物车中的商品进行管理和操作。

网页截图:

图3-5购物车

3.6 订单管理功能

文字描述:包括订单生成、跟踪和处理等功能。

网页截图:

图3-6订单

四、项目总结

使用本项目的优势在于它为广大用户提供了一个便捷、高效的外设购物平台。通过本项目,用户可以轻松浏览、选择并购买各类外设产品,无需再耗费大量时间和精力在实体店或其他线上平台中进行挑选。此外,本项目还具备一系列较为全面的功能,如智能推荐、实时客服等,旨在提升用户的购物体验。

在功能方面,智能推荐系统能够根据用户的浏览历史和购买记录,为用户推荐符合其需求的外设产品,从而提高了用户的购物效率。同时,实时客服服务能够为用户提供及时、专业的解答,帮助用户解决在购物过程中遇到的问题。

然而,需要指出的是,尽管本项目在提供便捷的外设购物体验方面取得了一定的成绩,但我们也认识到在某些方面仍存在不足。首先,在个性化服务方面,本项目尚未提供针对用户的个性化定制服务,这使得部分追求个性化的用户可能无法完全满足其需求。其次,在某些复杂场景下,如大量用户同时在线购物或处理大量订单时,项目的性能还有待进一步提升。此外,界面设计方面虽然整体简洁明了,但仍有待进一步优化,以提供更美观、易用的购物界面。

针对以上不足,我们将采取一系列措施进行优化和改进。在个性化服务方面,我们将积极探索并引入个性化定制功能,以满足用户对个性化外设的需求。在性能优化方面,我们将加大技术研发投入,提升项目的处理能力和稳定性,确保在高峰时段也能为用户提供流畅、稳定的购物体验。同时,我们还将对界面设计进行持续改进,注重色彩搭配和布局合理性,以提供更加美观、易用的购物界面。

总之,本项目在提供便捷的外设购物体验方面已经取得了显著的成果,但仍需不断优化和改进,以更好地满足用户的需求和期望。我们将继续努力提升项目的功能和性能,并不断完善用户体验,以打造一个更加优秀、专业的外设购物平台。

完整源码:

java 复制代码
      @WebServlet("/commodityservlet")

      public class commodityservlet extends HttpServlet {

          //定义一个commodityService作为属性,以便调用相关方法

          commodityService commodityService = new commodityServiceImpl();



          protected void queryByTitle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              String bname = request.getParameter("value");

              commodityServiceImpl service = new commodityServiceImpl();

              List<commoditys> searchBList = new ArrayList<commoditys>();

              searchBList = service.getcommoditysByTitle(bname);

              //封装成分页对象

              PageBean<commoditys> Pager = new PageBean<commoditys>(1, 5, searchBList);

              request.getSession().setAttribute("searchcommoditys", Pager);

              response.sendRedirect("search.jsp");

          }



          protected void queryByPublish(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              String bname = request.getParameter("value");

              commodityServiceImpl service = new commodityServiceImpl();

              List<commoditys> searchBList = new ArrayList<commoditys>();

              searchBList = service.getcommoditysByPublishName(bname);

              //封装成分页对象

              PageBean<commoditys> Pager = new PageBean<commoditys>(1, 5, searchBList);

              request.getSession().setAttribute("searchcommoditys", Pager);

              response.sendRedirect("search.jsp");

          }



          protected void queryByCategoryName(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              String bname = request.getParameter("value");

              commodityServiceImpl service = new commodityServiceImpl();

              List<commoditys> searchBList = new ArrayList<commoditys>();

              searchBList = service.getcommoditysByCategoryName(bname);

              //封装成分页对象

              PageBean<commoditys> Pager = new PageBean<commoditys>(1, 5, searchBList);

              request.getSession().setAttribute("searchcommoditys", Pager);

              response.sendRedirect("search.jsp");

          }

      }

Dao 层代码示例:

      package dao.impl;



      import bean.commoditys;

      import dao.commodityDao;

      import utils.JDBCUtilsByDruid;

      import org.apache.commons.dbutils.QueryRunner;

      import org.apache.commons.dbutils.handlers.BeanListHandler;



      public class commodityDaoImpl implements commodityDao {

          private QueryRunner qr = new QueryRunner();



          @Override

          public List<commoditys> getcommoditysByTitle(String title) {

              String sql = "SELECT * FROM commoditys WHERE title LIKE?";

              try {

                  return qr.query(JDBCUtilsByDruid.getConnection(), sql, new BeanListHandler<commoditys>(commoditys.class), "%" + title + "%");

              } catch (Exception e) {

                  throw new RuntimeException(e);

              }

          }



          @Override

          public List<commoditys> getcommoditysByPublishName(String publishName) {

              String sql = "SELECT * FROM commoditys WHERE publish_name LIKE?";

              try {

                  return qr.query(JDBCUtilsByDruid.getConnection(), sql, new BeanListHandler<commoditys>(commoditys.class), "%" + publishName + "%");

              } catch (Exception e) {

                  throw new RuntimeException(e);

              }

          }



          @Override

          public List<commoditys> getcommoditysByCategoryName(String categoryName) {

              String sql = "SELECT * FROM commoditys WHERE category_name LIKE?";

              try {

                  return qr.query(JDBCUtilsByDruid.getConnection(), sql, new BeanListHandler<commoditys>(commoditys.class), "%" + categoryName + "%");

              } catch (Exception e) {

                  throw new RuntimeException(e);

              }

          }

      }

service 层代码示例:

      package service.impl;



      import bean.PageBean;

      import bean.commoditys;

      import dao.commodityDao;

      import dao.impl.commodityDaoImpl;

      import service.commodityService;



      public class commodityServiceImpl implements commodityService {

          private commodityDao commodityDao = new commodityDaoImpl();



          @Override

          public PageBean<commoditys> getcommoditysByTitle(String title, int pageNo, int pageSize) {

              //根据商品名获取商品列表

              List<commoditys> blist = commodityDao.getcommoditysByTitle(title);

              //计算总记录数

              int totalRow = blist.size();

              //计算总页数

              int pageTotalCount = totalRow / pageSize;

              if (totalRow % pageSize > 0) {

                  pageTotalCount++;

              }

              //根据分页参数获取当前页的商品列表

              List<commoditys> pageItems = blist.subList((pageNo - 1) * pageSize, Math.min(pageNo * pageSize, totalRow));

              //创建分页对象

              PageBean<commoditys> Pager = new PageBean<commoditys>(pageNo, pageSize, totalRow, pageTotalCount, pageItems);

              return Pager;

          }



          @Override

          public PageBean<commoditys> getcommoditysByPublishName(String publishName, int pageNo, int pageSize) {

              //根据店铺名称获取商品列表

              List<commoditys> blist = commodityDao.getcommoditysByPublishName(publishName);

              //计算总记录数

              int totalRow = blist.size();

              //计算总页数

              int pageTotalCount = totalRow / pageSize;

              if (totalRow % pageSize > 0) {

                  pageTotalCount++;

              }

              //根据分页参数获取当前页的商品列表

              List<commoditys> pageItems = blist.subList((pageNo - 1) * pageSize, Math.min(pageNo * pageSize, totalRow));

              //创建分页对象

              PageBean<commoditys> Pager = new PageBean<commoditys>(pageNo, pageSize, totalRow, pageTotalCount, pageItems);

              return Pager;

          }



          @Override

          public PageBean<commoditys> getcommoditysByCategoryName(String categoryName, int pageNo, int pageSize) {

              //根据分类名称获取商品列表

              List<commoditys> blist = commodityDao.getcommoditysByCategoryName(categoryName);

              //计算总记录数

              int totalRow = blist.size();

              //计算总页数

              int pageTotalCount = totalRow / pageSize;

              if (totalRow % pageSize > 0) {

                  pageTotalCount++;

              }

              //根据分页参数获取当前页的商品列表

              List<commoditys> pageItems = blist.subList((pageNo - 1) * pageSize, Math.min(pageNo * pageSize, totalRow));

              //创建分页对象

              PageBean<commoditys> Pager = new PageBean<commoditys>(pageNo, pageSize, totalRow, pageTotalCount, pageItems);
serlvet 层代码示例:

      @WebServlet("/OrderServlet")

      public class OrderServlet extends HttpServlet {

          private OrderService orderService = new OrderServiceImpl();



          protected void saveOrder(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

              Cart cart = (Cart) req.getSession().getAttribute("cart");

              //如果cart为null,说明没有买任何东西,直接转发到首页

              if (null == cart) {

                  req.getRequestDispatcher("/index.jsp").forward(req, resp);

                  return;

              }

              //获取当前登录的memberId

              Member member = (Member) req.getSession().getAttribute("member");

              if (null == member) {//说明用户没有登陆,转发到登陆页面

                  req.getRequestDispatcher("/views/member/login.jsp").forward(req, resp);

                  return;

              }

              //生成订单

              String orderId = orderService.saveOrder(cart, member.getId());

              req.getSession().setAttribute("orderId", orderId);

              resp.sendRedirect(req.getContextPath() + "/views/order/checkout.jsp");

          }

      }

Dao 层代码示例:

      package dao.impl;

      import bean.Order;

      import dao.OrderDAO;

      import utils.JDBCUtilsByDruid;

      import org.apache.commons.dbutils.QueryRunner;

      import org.apache.commons.dbutils.handlers.BeanHandler;

      import org.apache.commons.dbutils.handlers.ScalarHandler;

      public class OrderDAOImpl implements OrderDAO {

          private QueryRunner qr = new QueryRunner();



          @Override

          public int saveOrder(Order order) {

              String sql = "INSERT INTO `order`(member_id, total_price) VALUES(?,?)";

              Object[] params = {order.getMemberId(), order.getTotalPrice()};

              return update(sql, params);

          }

      }

service 层代码示例

      package service.impl;

      import bean.Cart;

      import bean.Member;

      import bean.Order;

      import dao.OrderDAO;

      import dao.impl.OrderDAOImpl;

      import service.OrderService;



      public class OrderServiceImpl implements OrderService {

          private OrderDAO orderDAO = new OrderDAOImpl();



          @Override

          public String saveOrder(Cart cart, int memberId) {

              //创建订单对象

              Order order = new Order();

              order.setMemberId(memberId);

              order.setTotalPrice(cart.getTotPrice());

              //保存订单到数据库

              orderDAO.saveOrder(order);

              //返回订单id

              return order.getId();

          }

      }  serlvet 层代码示例:

      @WebServlet("/OrderServlet")

      public class OrderServlet extends HttpServlet {

          private OrderService orderService = new OrderServiceImpl();



          protected void saveOrder(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

              Cart cart = (Cart) req.getSession().getAttribute("cart");

              //如果cart为null,说明没有买任何东西,直接转发到首页

              if (null == cart) {

                  req.getRequestDispatcher("/index.jsp").forward(req, resp);

                  return;

              }

              //获取当前登录的memberId

              Member member = (Member) req.getSession().getAttribute("member");

              if (null == member) {//说明用户没有登陆,转发到登陆页面

                  req.getRequestDispatcher("/views/member/login.jsp").forward(req, resp);

                  return;

              }

              //生成订单

              String orderId = orderService.saveOrder(cart, member.getId());

              req.getSession().setAttribute("orderId", orderId);

              resp.sendRedirect(req.getContextPath() + "/views/order/checkout.jsp");

          }

      }

Dao 层代码示例:

      package dao.impl;

      import bean.Order;

      import dao.OrderDAO;

      import utils.JDBCUtilsByDruid;

      import org.apache.commons.dbutils.QueryRunner;

      import org.apache.commons.dbutils.handlers.BeanHandler;

      import org.apache.commons.dbutils.handlers.ScalarHandler;

      public class OrderDAOImpl implements OrderDAO {

          private QueryRunner qr = new QueryRunner();



          @Override

          public int saveOrder(Order order) {

              String sql = "INSERT INTO `order`(member_id, total_price) VALUES(?,?)";

              Object[] params = {order.getMemberId(), order.getTotalPrice()};

              return update(sql, params);

          }

      }

service 层代码示例

      package service.impl;

      import bean.Cart;

      import bean.Member;

      import bean.Order;

      import dao.OrderDAO;

      import dao.impl.OrderDAOImpl;

      import service.OrderService;



      public class OrderServiceImpl implements OrderService {

          private OrderDAO orderDAO = new OrderDAOImpl();



          @Override

          public String saveOrder(Cart cart, int memberId) {

              //创建订单对象

              Order order = new Order();

              order.setMemberId(memberId);

              order.setTotalPrice(cart.getTotPrice());

              //保存订单到数据库

              orderDAO.saveOrder(order);

              //返回订单id

              return order.getId();

          }

      }  
相关推荐
Yvemil75 分钟前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java
Anna。。6 分钟前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea
一个程序员_zhangzhen16 分钟前
sqlserver新建用户并分配对视图的只读权限
数据库·sqlserver
zfj32119 分钟前
学技术学英文:代码中的锁:悲观锁和乐观锁
数据库·乐观锁··悲观锁·竞态条件
吴冰_hogan21 分钟前
MySQL InnoDB 存储引擎 Redo Log(重做日志)详解
数据库·oracle
.生产的驴28 分钟前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
爱上语文30 分钟前
宠物管理系统:Dao层
java·开发语言·宠物
nbsaas-boot37 分钟前
探索 JSON 数据在关系型数据库中的应用:MySQL 与 SQL Server 的对比
数据库·mysql·json
cmdch201738 分钟前
Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题
数据库·sql·mybatis
程序员学习随笔40 分钟前
PostgreSQL技术内幕21:SysLogger日志收集器的工作原理
数据库·postgresql