javaweb网上商城系统

网上商城系统

  1. 项目开发流程
  2. 数据库分析设计
  3. b/s架构web开发的理解
  4. web技术回顾练习
  5. 前端技术加强
  6. 新技术学习

一、网上商城

  1. 网上商城介绍

    网上商城类似于现实商店,利用电子商务,达成买卖过程。

  2. 商城类别

    英文类别介绍典型代表
    B2B商家对商家中国制造网
    B2C商家对顾客销售京东
    C2C客户和客户淘宝
    O2O线上线下相结合象屿商城
  3. 商城常见模块

    3.1 后台常见功能模块:

    ​ 1、商品管理:商品库存、上货、出货、编辑管理、商品分类管理、商品品牌管理。

    ​ 2、订单管理:生成购买订单。

    ​ 3、商品促销:商品促销功能。

    ​ 4、 支付方式:网上钱包、银行卡(网银在线)、支付宝、微信、货到付款、微信。

    ​ 5、配送方式:在线选择物流模式,顺丰、邮政、。。。

    ​ 6、会员模块:集成会员注册,二次购买、提升转化率。

    3.2 前端页面功能模块

    ​ 1、模块风格自定义:通过系统内置引擎,通过后台可视化编辑,设计出客户需求的风格界面。

    ​ 2、商品多图展示:提供前台多张图片展示。

    ​ 3、自定义广告模块:内置系统中的广告模块,网站管理员可以通过操作在前端添加各种广告图片。

    ​ 4、商品展示:通过前端界面,以标准化或者个性化方式展示商品信息。

    ​ 5、购物车:随时增加、删除商品。

二、软件开发概要

  1. 周期和阶段

    • 起始阶段(Inception):有一个想法
    • 细化阶段(Elaboration):计划必要的活动和资源,确定功能设计架构
    • 构建阶段(Construction):构建产品,发展最初设想、架构和计划。
    • 移交阶段(Translition):移交用户使用,包括:交付、培训、维护。
  2. 开发流程

    2.1 需求分析

    ​ 1、初步了解

    ​ 2、深入分析,形成需求文档

    ​ 3、确认需求

    2.2 概要分析

    ​ 系统基本处理流程、系统组织架构、模块划分、功能分配、接口设计、数据结构、出错设计等。

    2.3 详细设计

    ​ 具体模块所用到的算法、数据结构、类的层次结构及调用关系,各个层次中程序设计考虑。

    2.4 编码

    2.5 测试

    2.6 交付

    2.7 验收

    2.8 维护

三、EStop项目介绍

  1. 开发环境
分类名称语种
操作系统无要求简体中文
数据库平台mysql
应用服务器tomcat
java开发工具idea
框架
项目名称
  1. 主要功能
序号模块名称主要功能
1商品显示模块分页显示所有商品查看
单个商品详细信息搜索商品
2用户模块新用户注册
用户登录
用户退出
3购物车模块加入商品
修改商品数量
4订单模块提交订单
显示订单
用户确认后生成正式订单
查看历史订单
5支付模块完成支付
6收货地址管理收货地址
7后台模块实现商品增删改查
  1. 项目展示

    1、导入项目

    2、导入数据库

    3、运行

    4、效果展示
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpnExM1V-1650366514448)(TyporaIMG/网上商城系统/image-20220416125326337.png)]

四、数据库设计

  1. PoweDesigner设计软件介绍

    数据库设计软件,开发人员常用数据库建模工具。从概念模型和数据模型两个方面对数据库进行设计。

    1.1 概念数据模型cdm

    ​ 描述实体定义和实体关系定义。用来标识实体的是属性。

    1.2 物理数据模型pdm

    ​ 针对目标数据库管理系统的具体化。

    ​ pdm对象:表(table)、表中的列(table column)、主外键(primary 、foreign key)、参照(reference)、索引(index)、试图(view)。

    1.3 cdm和pdm比较

    cmd:描述存储的实体、属性、实体关系。

    pdm:带概念数据库模型进行升级,将实体转化成具有数据库特性的模型!

    1.4 数据库设计步骤

    ​ 1、设计cdm模型

    ​ 2、生成pdm模型

    ​ 3、生成dbms脚本

  2. 用户模块涉及表

    2.1 用户表user

    字段类型主键约束备注
    idint自增序号
    usernamevarchar(20)not null用户名称
    passwordvarchar(64)not null密码,使用md5
    emailvarchar(50)not null邮箱,不可重复
    genderchar(1)性别
    flagint状态标记:0未激活;1激活;2无效
    roleint角色:0管理员;1会员
    codevarchar(100)激活码

    2.2 收货地址表address

    字段类型主键约束备注
    idint自增序号
    namevarchar(30)地址收件人
    phonevarchar(14)收件人手机号
    detailvarchar(200)收件人详细地址
    stateint默认地址:0-不是;1-是

    注意:一个用户多个收货地址:用户-收货地址一对多。

  3. 商品模块涉及表

    3.1类别表(类别实体type)

    名字字段类型主键约束备注
    类别主键t_idint自增类别主键
    类别名称t_namevarchar(20)类别名称
    类别描述t_infovarchar(200)类别描述

    3.1商品表(商品实体product)

    名字字段类型主键约束备注
    商品主键p_idint自增商品唯一标识
    商品名称p_namevarchar(50)商品名称
    商品上市时间p_timedate商品上市时间
    商品图片p_imagevarchar(100)商品图片路径
    商品价格p_pricedecimal(12,2)商品价格
    热门指数p_stateint商品热门指数
    商品描述p_infovarchar(200)商品描述

    注意:一个类别多件商品:类别-商品一对多。

  4. 购物车模块涉及表

    4.1 购物车实体(cart)

    名字字段类型主键约束备注
    购物车主键c_idint自增购物车唯一标识
    购物车商品的小计c_countdecimal(12,2)购物车的小计
    购物车商品数量c_numint购物车商品数量

    注意:一个用户多个购物车:用户-购物车一对多;

    ​ 一个购物车多个商品:购物车-商品一对多。

  5. 订单模块

    5.1 订单实体(orders)

    名字字段类型主键约束备注
    订单编号o_idvarchar(64)自增订单编号是字符串类型,也是唯一标识
    订单金额o_countdecimal(12,2)订单总金额
    订单时间o_timedetetime订单详细时间
    订单支付状态o_stateint状态:0-未付款;1-付款未发货;2-发货未收货;3-收货待评价;4-订单完成;5-退货状态。
    订单收货地址o_detailvarchar(200)订单收货地址
    订单收件人联系电话o_phonevarchar(14)订单收件人联系方式
    订单收件人o_namevarchar(20)订单收件人姓名

    注意:用户-订单多对一;

    ​ 地址-订单一对多。

    5.2 订单项(item)

    名字字段类型主键约束备注
    订单项主键i_idint自增订单项唯一标识符
    订单项的小计i_countdecimal(12,2)订单项小计
    订单项的数量i_numint订单项数量

    注意:商品-订单项一对多;

五、项目搭建和准备工作

  1. 创建项目

  2. 导入工具类

  3. 导入jar包
    在这里插入图片描述

  4. 导入配置文件

  5. 导入页面

  6. 创建baseServlet

    • 创建baseServlet必要性

      现在我们只要实现一个功能,我们需要创建一个servlet

      例如:用户模块(登录、注册、退出登录、激活、发送邮件等功能)

      也就是说,我们必须创建一些系列的servlet:UserServlet——》登录功能

      UserRegister——》注册功能

      总之想要实现一个功能就需要一个servlet

      弊端:

      1. 创建大量servlet!servlet实例——》web容器(tomcat)管理,有大量的servlet实例必然会占用更大的运行内存,会间接拖慢web容器速度。
      2. servlet它的是service(doget/dopost)方法是一个多线程方法,,一个servlet可以处理很多次请求,可以并发处理!一个servlet能力很强,但是只对应一个功能会浪费。

      BaseServlet简化和优化servlet的创建和数量。

    • 实现BaseServlet思路

      1. 为什么servlet只对应一个功能

        一个servlet被访问之后只有一个方法被调用,通常我们习惯一个方法中写一个业务逻辑!

        一个servlet对应方法对应一个业务功能。

      2. 分析Baseservlet实现的思路

        1. 让一个servlet对应多个方法,每个方法实现一个业务逻辑

        2. 具体实现思路

          步骤1:在servlet声明多个处理业务逻辑方法。

          步骤2:在每次访问servlet时在路径上添加一个标识,标识用于判断要访问的具体业务逻辑方法。

          步骤3:当每次请求到doget/dopost/servlet方法的时候,判断参数的标识,调用对应的业务逻辑方法。
          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aLiQCWNN-1650366559984)(TyporaIMG/网上商城系统/image-20220417083710679.png)]

    • 具体BaseServlet实现

      1. 实现基本的baseservlet

      2. 优化方法调用

        利用标识符的字符串和方法名相同

        我们可以利用反射技术,调用对应的执行方法。

        避免大量的判断

        当有新的方法出现时,也不需要额外添加判断的方法。

        service(){

        ​ 1.获取标识符

        2.根据标识符调用对应的逻辑方法

        ​ 利用反射技术

        }

      3. 优化servlet实现

        实现思路:

        ​ 创建一个BaseServlet类,继承HttpServlet,在BaseServlet中写service方法

        ​ 在service写获取标识符和反射调用业务逻辑

        ​ 每个模块对应的Controller只需要集成BaseServlet即可。

        ​ HttpServlet——》BaseServlet——》模块的Controller

      4. 优化返回值问题

        每个方法都要进行响应

        响应方式固定:转发、 重定向 、返回字符串 、返回字节流

        如果每个方法写转发和重定向和返回字符串的语法比较繁琐

        我们可以统一在BaseServlet进行处理

        ​ 操作:步骤1:将方法的返回值改为字符串即可

        ​ 步骤2:根据约定的内容,添加特殊标志

        ​ 例如:转发“forword”路径

        ​ 步骤3:BaseServlet集中处理

        ​ 执行方法,获取标识符,进行非空判断

        ​ 截取标识,进行重定向或者写回字符串处理

        好处:简化方法响应的处理

        注意:没有管返回字节。

        ​ 返回字节,我们只需要将方法的返回值改成void,只需要使用response对象自己手动操作即可。

      5. 处理标识符异常情况

        /**
         * BaseServlet用于集中处理方法的调用!
         * 以及返回值处理!
         * 以及默认页对应方法!
         */
        public class BaseServlet extends HttpServlet {
        
            @Override
            protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
                //1.获取请求参数(标识符)
                String methodStr = req.getParameter(Constants.TAG);
                //2.如果method没有获取到值!我们就跳转到首页!(标识符异常处理)
                if (methodStr == null && methodStr.equals("")) {
                    methodStr = Constants.INDEX;
                }
        
                //3.反射调用对应的业务逻辑方法
                Class  clazz = this.getClass();
        
                try {
                    Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);
        
                    Object result = method.invoke(this,req,resp);
        
                    //4.集中处理返回值响应
                    if (result != null) {
                        //转发 重定向  返回字符
                        String str = (String) result;
                        if (str.startsWith(Constants.FORWARD)) {
                            //转发
                            String path = str.substring(str.indexOf(Constants.FLAG) + 1);
                            req.getRequestDispatcher(path).forward(req,resp);
                        }else if (str.startsWith(Constants.REDIRECT)){
                            //重定向
                            String path = str.substring(str.indexOf(Constants.FLAG) + 1);
                            resp.sendRedirect(path);
                        }else{
                            resp.getWriter().println(str);
                        }
                    }
        
                } catch (Exception e) {
                    e.printStackTrace();
                    //controller 和 service dao 有异常都会到此处!
                    req.getSession().setAttribute("msg", "程序异常!请稍后再试!");
                    resp.sendRedirect("/message.jsp");
        
                }
            }
        
            /**
             * 当method标识符‘没有值’ 我们默认赋 index 访问每个controller的index方法!
             * 我们将方法提取到baseservlet中即可!
             * 默认处理:跳转到程序的首页!
             * @param req
             * @param resp
             * @return
             * @throws IOException
             * @throws ServletException
             */
            public String index(HttpServletRequest req,HttpServletResponse resp) throws IOException, ServletException {
        
                return Constants.FORWARD+"/index.jsp";
            }
        }
        
  7. 运行项目

六、项目编码

  1. 用户管理模块

    用户模块涉及功能:注册,登录,自动登录,退出登录

    1.1 新用户注册

    需求编号Shopping_004
    功能名称新用户注册
    功能描述1. 用户名Ajax认证
    2. 注册功能(未激活状态)
    3.发送激活邮件
    4.账号激活
    备注账号需要激活才可以使用(邮箱验证)

    1.2 用户登录

    1.3 用户退出

  2. 商品模块

    2.1 商品展示

    2.2 查看商品详情

  3. 购物车模块

    3.1 加入商品到购物车

    3.2 生成订单并显示

  4. 收货地址管理

    4.1 查看地址

  5. 后台管理


版权声明:本文为weixin_54089340原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。