网上商城系统

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

一、网上商城

  1. 网上商城介绍
    网上商城类似于现实商店,利用电子商务,达成买卖过程。
  2. 商城类别

英文类别

介绍

典型代表

B2B

商家对商家

中国制造网

B2C

商家对顾客销售

京东

C2C

客户和客户

淘宝

O2O

线上线下相结合

象屿商城

  1. 商城常见模块
    3.1 后台常见功能模块:
    1、商品管理:商品库存、上货、出货、编辑管理、商品分类管理、商品品牌管理。
    2、订单管理:生成购买订单。
    3、商品促销:商品促销功能。
    4、 支付方式:网上钱包、银行卡(网银在线)、支付宝、微信、货到付款、微信。
    5、配送方式:在线选择物流模式,顺丰、邮政、。。。
    6、会员模块:集成会员注册,二次购买、提升转化率。
    3.2 前端页面功能模块
    1、模块风格自定义:通过系统内置引擎,通过后台可视化编辑,设计出客户需求的风格界面。
    2、商品多图展示:提供前台多张图片展示。
    3、自定义广告模块:内置系统中的广告模块,网站管理员可以通过操作在前端添加各种广告图片。
    4、商品展示:通过前端界面,以标准化或者个性化方式展示商品信息。
    5、购物车:随时增加、删除商品。

二、软件开发概要

  1. 周期和阶段
  • 起始阶段(Inception):有一个想法
  • 细化阶段(Elaboration):计划必要的活动和资源,确定功能设计架构
  • 构建阶段(Construction):构建产品,发展最初设想、架构和计划。
  • 移交阶段(Translition):移交用户使用,包括:交付、培训、维护。
  1. 开发流程
    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、效果展示
  2. java 商城 手机 端 javaweb商城_学习

四、数据库设计

  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

字段

类型

主键

约束

备注

id

int


自增

序号

username

varchar(20)

not null

用户名称

password

varchar(64)

not null

密码,使用md5

email

varchar(50)

not null

邮箱,不可重复

gender

char(1)

性别

flag

int

状态标记:0未激活;1激活;2无效

role

int

角色:0管理员;1会员

code

varchar(100)

激活码

2.2 收货地址表address

字段

类型

主键

约束

备注

id

int


自增

序号

name

varchar(30)

地址收件人

phone

varchar(14)

收件人手机号

detail

varchar(200)

收件人详细地址

state

int

默认地址:0-不是;1-是

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

  1. 商品模块涉及表
    3.1类别表(类别实体type)

名字

字段

类型

主键

约束

备注

类别主键

t_id

int


自增

类别主键

类别名称

t_name

varchar(20)

类别名称

类别描述

t_info

varchar(200)

类别描述

3.1商品表(商品实体product)

名字

字段

类型

主键

约束

备注

商品主键

p_id

int


自增

商品唯一标识

商品名称

p_name

varchar(50)

商品名称

商品上市时间

p_time

date

商品上市时间

商品图片

p_image

varchar(100)

商品图片路径

商品价格

p_price

decimal(12,2)

商品价格

热门指数

p_state

int

商品热门指数

商品描述

p_info

varchar(200)

商品描述

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

  1. 购物车模块涉及表
    4.1 购物车实体(cart)

名字

字段

类型

主键

约束

备注

购物车主键

c_id

int


自增

购物车唯一标识

购物车商品的小计

c_count

decimal(12,2)

购物车的小计

购物车商品数量

c_num

int

购物车商品数量

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

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

  1. 订单模块
    5.1 订单实体(orders)

名字

字段

类型

主键

约束

备注

订单编号

o_id

varchar(64)


自增

订单编号是字符串类型,也是唯一标识

订单金额

o_count

decimal(12,2)

订单总金额

订单时间

o_time

detetime

订单详细时间

订单支付状态

o_state

int

状态:0-未付款;1-付款未发货;2-发货未收货;3-收货待评价;4-订单完成;5-退货状态。

订单收货地址

o_detail

varchar(200)

订单收货地址

订单收件人联系电话

o_phone

varchar(14)

订单收件人联系方式

订单收件人

o_name

varchar(20)

订单收件人姓名

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

地址-订单一对多。

5.2 订单项(item)

名字

字段

类型

主键

约束

备注

订单项主键

i_id

int


自增

订单项唯一标识符

订单项的小计

i_count

decimal(12,2)

订单项小计

订单项的数量

i_num

int

订单项数量

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

五、项目搭建和准备工作

  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对应方法对应一个业务功能。

  1. 分析Baseservlet实现的思路
  1. 让一个servlet对应多个方法,每个方法实现一个业务逻辑
  2. 具体实现思路
    步骤1:在servlet声明多个处理业务逻辑方法。
    步骤2:在每次访问servlet时在路径上添加一个标识,标识用于判断要访问的具体业务逻辑方法。
    步骤3:当每次请求到doget/dopost/servlet方法的时候,判断参数的标识,调用对应的业务逻辑方法。
  • 具体BaseServlet实现
  1. 实现基本的baseservlet
  2. 优化方法调用

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

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

避免大量的判断

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

service(){

1.获取标识符

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

利用反射技术

}

  1. 优化servlet实现

实现思路:

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

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

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

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

  1. 优化返回值问题

每个方法都要进行响应

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

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

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

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

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

例如:转发“forword”路径

步骤3:BaseServlet集中处理

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

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

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

注意:没有管返回字节。

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

  1. 处理标识符异常情况
/**
 * 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";
    }
}
  1. 运行项目

六、项目编码

  1. 用户管理模块

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

  1. 1.1 新用户注册

需求编号

Shopping_004

功能名称

新用户注册

功能描述

1. 用户名Ajax认证

2. 注册功能(未激活状态)

3.发送激活邮件

4.账号激活

备注

账号需要激活才可以使用(邮箱验证)

1.2 用户登录

1.3 用户退出

  1. 商品模块
    2.1 商品展示
    2.2 查看商品详情
  2. 购物车模块
    3.1 加入商品到购物车
    3.2 生成订单并显示
  3. 收货地址管理
    4.1 查看地址
  4. 后台管理