Web实战——电商项目

文章目录

  • 电商项目实践
    • 1 准备数据
        • 模块说明
        • 实践过程
        • 相关技术
    • 2 搭建 maven 私服(nexus)
        • 模块说明
        • 实践过程
        • 相关技术
    • 3 Dubbo 服务
        • 模块说明
        • 实践过程
        • 相关技术
    • 4 后台系统——商品管理模块(一)
        • 后台系统说明
        • 模块说明
        • 实践过程
        • 相关技术
    • 5 后台系统——商品管理模块(二)
        • 模块说明
        • 实践过程
        • 相关技术
    • 6 后台系统——商品管理模块(三)
        • 模块说明
        • 实践过程
        • 相关技术
    • 7 后台系统——内容管理模块
        • 模块说明
        • 实践过程
        • 相关技术
    • 8 前台系统——电商门户模块(一)
        • 前台系统说明
        • 模块说明
        • 实践过程
        • 相关技术
    • 9 前台系统——电商门户模块(二)
        • 模块说明
        • 实践过程
        • 相关技术
    • 10 前台系统——商品搜索模块
        • 模块说明
        • 实践过程
        • 相关技术
    • 11 前台系统——商品详情模块
        • 模块说明
        • 实践过程
        • 相关技术
    • 12 前台系统——注册登录模块
        • 模块说明
        • 实践过程
        • 相关技术
    • 13 前台系统——购物车管理模块
        • 模块说明
        • 实践过程
        • 相关技术
    • 14 前台系统——订单管理模块
        • 模块说明
        • 实践过程
        • 相关技术

电商项目实践

项目来自尚学堂。
项目代码:ego
开发工具和环境:

  • IDEA 2019.3
  • JDK 1.8
  • Maven 3.6.3
  • Tomcat 7.0.56
  • MySQL 5.7
  • Redis 3.0.0
  • Nignx 1.8.0

1 准备数据

模块说明

  • 将已有的用户、商品、内容、订单数据导入数据库,并通过逆向工程生成数据访问层(mapper)和实体类(pojo)。

实践过程

(1) 安装 MySQL 数据库

  • 安装 MySQL (port:3306) 数据库,Navicat 进行可视化管理。

(2) 导入数据

  • 执行 SQL 文件导入相关数据。

(3) 逆向工程生成 pojo 和 mapper

  • Mybatis 提供 MyBatisGenerator 类,可以根据 xml 文件中的配置(数据库连接信息、指定数据库表)在指定路径生成实体类(pojo)和数据访问层(mapper)。(逆向工程

相关技术

  • MySQL(Navicat、SQL)
  • Mybatis(逆向工程、实现数据访问层)
  • XML(配置与解析)

2 搭建 maven 私服(nexus)

模块说明

  • 出于保密,公司使用内网开发,于是 maven 不能连接远程仓库来引用 jar 包。
  • nexus 服务器一方面可以作为 maven 连接远程仓库的中转站,另一方面可以作为一个“中央仓库”,一个项目组开发的项目可以发布到中央仓库,也可以引用其他项目组发布到中央仓库的项目。即实现“内网开发,项目共享”。

实践过程

(1) 安装配置 nexus 服务器

  • 安装 nexus(port:8091);
  • nexus 配置文件中中修改端口号后启动服务;
  • 访问 http://localhost:8091/nexus 登录,默认账户-admin 密码-admin123;
  • 添加Central库离线索引(用于搜索远程仓库)。

(2) maven 连接 nexus

  • maven 配置文件中中配置nexusTest并激活
  • 将远程仓库路径修改为私服仓库路径

(3) 项目发布到私服和引用私服中的项目

  • 本地项目的pom.xml文件中添加releases和snapshots;
  • 在maven配置文件的servers下配置releases和snapshots的账户和密码;
  • maven 的 deploy 可发布项目到私服;
  • 引用私服中的项目只需在本地项目的 pom.xml 中添加私服相应的项目依赖即可。

详见 工具组件——使用nexus搭建maven私服、发布项目及引用项目

相关技术

  • maven(管理项目 jar 包)
  • nexus(内网开发,项目共享)

3 Dubbo 服务

模块说明

  • 分布式开发会把一个大的项目根据功能拆分成几个小的项目,每个小项目里都有控制层、服务层、实体类和数据访问层。由于各个小项目都是访问同一个数据库里的数据,因此实体类和数据访问层的代码有很多重复。
  • 为了减少代码冗余,提高开发效率,将数据访问层从各个项目中拆解出来,搭建一个专门访问数据库的项目,为其他项目提供访问数据库的服务。(采用了 SOA (Service Oriented Architecture 面向服务架构) 思想)
  • 服务项目只提供功能列表,而隐藏具体实现,其他项目通过功能列表获取服务,从而保证了数据的安全性。(遵循了 PRC (Remote Procedure Call 远程过程访问) 协议)
  • Dubbo 便是阿里巴巴公司开发的一个遵循 RPC 协议的服务框架。

实践过程

(1) 安装 zookeeper

  • 在一台主机(笔者用的是 CentOS-6.5-64)上安装 zookeeper (port:2181) 作为 Dubbo 注册中心。

(2) 创建项目

  • ego-parent:父项目、pom 类型
  • ego-commons:存放工具类、jar 类型
  • ego-pojo:存放逆向工程生成的实体类(pojo)、jar 类型
  • ego-service:服务接口、jar 类型
  • ego-service-impl:数据访问层 (mapper) 和服务实现 (provider) 、jar 类型
    • 配置注册中心地址和端口,配置 Dubbo 端口为 20888,注册服务。

相关技术

  • Dubbo(搭建服务)
  • Zookeeper(作为 Dubbo 注册中心)
  • Spring(管理 Mybatis 和服务)

4 后台系统——商品管理模块(一)

后台系统说明

(1) 后台系统

  • 后台系统是管理人员用来进行商品和内容管理的平台,本次实践仅实现 商品管理模块内容管理模块(CMS) 的功能。

Web实战——电商项目_第1张图片

(2) 管理的数据

商品类目 商品规格参数类目 商品 内容类目 内容
tb_item_cat tb_item_param tb_item
tb_item_desc
tb_item_param_item
tb_content_category tb_content

(3) 需要实现的业务

商品类目 商品规格参数类目 商品 内容类目 内容
树状显示 分页查询
新增
修改
删除
分页查询
新增
修改
删除
上架
下架
树状显示
新增
修改
删除
分页查询
新增
修改
删除

(4) 前端和后端交互

  • 后台管理界面前端开发人员已经写好,点击界面上相应的按钮,会向指定主机和端口发送 HTTP 请求。如点击查询商品会发起 GET 请求:http://localhost/item/list?page=1&rows=30 。
  • 根据请求 URL 和返回值要求(有专门的 接口文档 进行说明),在 ego-manage 项目中编写相应的业务逻辑代码。

Web实战——电商项目_第2张图片
Web实战——电商项目_第3张图片

模块说明

  • 商品管理模块(一)中主要实现 页面访问业务商品的分页查询、删除、上架和下架业务

实践过程

(1) 创建并配置 ego-manage 工程模块

  • war 类型,地址 http://localhost/ 。
  • webapp/WEB-INF/web.xml 中配置 SpringMVC 前端控制分发器、上下文参数(加载其他 XML 配置文件)、监听器、字符编码过滤器。
  • springmvc.xml 中配置扫描控制器注解、设置注解驱动、指定静态资源、自定义视图解析器。
  • applicationContext-spring.xml 中配置扫描服务层注解和属性文件。
  • applicationContext-dubbo.xml 中配置 Consumer 名称、注册中心地址和端口、服务层注解扫描(服务层会发起 Dubbo 服务请求)。

(2) 实现首页控制器和页面控制器

@Controller
public class PageController {
    @RequestMapping("/")  // 首页控制器
    public String welcome(){ return "index"; }

    @RequestMapping("{page}")  // 页面控制器
    public String showPage(String page){ return page; }
}
项目 页面访问业务接口
请求方法 GET
URL http://localhost/{page}
参数
示例 http://localhost/item-add
返回值 item-add.jsp 内容
数据表 无 // 该项为笔者自己添加,指 实现业务需要操作的数据表

Web实战——电商项目_第4张图片

(3) 实现商品分页查询业务(自顶而下设计,自低而上实现)

  • 在 ego-service 项目中新增商品服务接口。
  • 在 ego-service-impl 项目中实现商品分页查询服务并注册到 zookeeper。(用到 pagehelper 分页插件)
  • 在 ego-manage 项目的服务层编写业务逻辑代码,调用商品查询服务。
  • 在 ego-manage 项目的控制层处理商品分页查询请求,并调用服务层业务逻辑代码。
  • 使用本地 Tomcat 或 maven 自带 Tomcat 服务器运行 ego-manage 项目。
项目 商品分页查询业务接口
请求方法 GET
URL http://localhost/item/list
参数 page // 查询第几页
rows // 每页有多少行数据记录
示例 http://localhost/item/list?page=2&rows=10
返回值 {“rows”:[{“id”:816753,“title”:"夏普(SHARP)…},…],“total”:3119}
数据表 tb_item

Web实战——电商项目_第5张图片

(4) 实现商品删除、上架和下架业务

  • 过程与查询类似,只不过在数据访问层一个是对数据库查,一个是对数据库改。
  • tb_item 表中 status 属性 1-上架、2-下架、3-删除。
  • 三个业务接口类似,以下为商品删除业务接口说明。
项目 商品删除业务接口(本质是修改)
请求方法 POST
URL http://localhost/rest/item/delete
参数 ids // “,”连接的待删除商品 id
示例 http://localhost/rest/item/delete

ids:143762175492355,143762197412305
返回值 {“status”:200,“data”:null,“msg”:null} // 200 表示操作成功
数据表 tb_item

Web实战——电商项目_第6张图片

相关技术

  • HTTP(客户端和服务端通信的应用层协议)
  • ajax(HTTP 请求都是通过 ajax 发出的)
  • Servlet(web.xml、监听器、过滤器)
  • SpringMVC(实现和管理控制层、实现前端控制分发)
  • Spring(管理服务层)
  • pagehelper(分页插件)

5 后台系统——商品管理模块(二)

模块说明

  • 商品管理模块(二)中主要实现 图片上传文件服务器业务商品的新增、修改和类目显示业务
  • 商品新增业务里面涉及到图片的存储。由于图片一般比较大,不适合直接存储到数据库中。因此,一般是将图片存入文件服务器,将图片在文件服务器中的 URL 存入数据库。

实践过程

(1) 实现商品类目树状显示业务

项目 商品类目树状显示业务接口
请求方法 POST
URL http://localhost/item/cat/list
参数 id // 整型,父类目 id
示例 http://localhost/item/cat/list

id:1
返回值 [{“id”:1,“text”:“图书、音像、电子书刊”,“state”:“closed”},…]
数据表 tb_item_cat

Web实战——电商项目_第7张图片

(2) 搭建文件服务器和上传图片

  • 图片是在数据库中存储其 URL,因此需要专门的服务器来存储图片。在实现商品新增业务之前就要搭建好文件服务器。
  • 搭建图片服务器
    • 在一台主机上添加一个新用户(可命名为 ftpuser);
    • 在该主机下安装 VSFTPD (port:21) 服务器;
    • 在该主机下安装 Nginx(port:80)服务器,在 Nginx 配置文件中赋予 ftpuser 用户权限,设置代理路径为 VSFTPD 服务器的图片存储路径,欢迎页可选择任意文件。
  • 图片上传到图片服务器过程
    • 客户端发起 HTTP (POST)请求,通过 multipartResolver 上传到 Tomcat 服务器;
    • Tomcat 服务器进行 FTP 数据传输,通过 FTPClient 上传到 VSFTPD 图片服务器;
    • VSFTPD 图片服务器是基于 FTP 协议的,为了能从客户端通过 HTTP 协议访问图片,使用 Nginx 服务器(基于 HTTP 协议)进行反向代理。
项目 图片上传文件服务器业务接口
请求方法 POST
URL http://localhost/pic/upload?dir=image
参数 Filename // 文件名
uploadFile // 文件二进制数据
Upload
示例 http://localhost/pic/upload?dir=image

Filename:1.png
uploadFile:(binary)
Upload:Submit Query
返回值 {“error”:0,“url”:“http://192.168.238.131/1595949596028880.png”}
数据表

Web实战——电商项目_第8张图片

(3) 实现商品新增业务

项目 商品新增业务接口
请求方法 POST
URL http://localhost/item/save
参数 见下图
示例 见下图
返回值 {“status”:200,“data”:null,“msg”:null}
数据表 tb_item、tb_item_desc、tb_item_param_item

Web实战——电商项目_第9张图片

Web实战——电商项目_第10张图片
Web实战——电商项目_第11张图片

Web实战——电商项目_第12张图片

  • 实现商品修改业务
    • 与商品新增业务相似,只不过在数据访问层一个是向数据库插入,一个是对数据库修改。
    • 另外商品修改时,会涉及到对 tb_item、tb_item_desc、tb_item_param_item 三个数据表的查询和修改,会用到 Spring 中的 声明式事务。若对一个数据表的操作失败,三个数据表中的数据都会回滚到操作前的状态。

相关技术

  • FTP(文件传输协议)
  • multipartResolver(基于 HTTP 协议的文件上传)
  • FTPClient(基于 FTP 协议的文件上传)
  • VSFTPD(基于 FTP 协议的服务器)
  • Nginx(基于 HTTP 协议的服务器)
  • Spring(声明式事务)

6 后台系统——商品管理模块(三)

模块说明

  • 商品管理模块(三)中主要实现 规格参数类目的分页查询、新增、编辑、删除
  • 每一件商品都有规格参数的说明。规格参数是由许多键值对组成的对商品的描述信息(不妨称为“规格参数内容”),对应 tb_item_param_item 。
  • 每个商品类目(最底层的,如手机)都拥有相同的规格键(如品牌、型号),可把这些规格键归纳出来存储(不妨称为“规格参数类目”),对应 tb_item_param。在新增商品的时候,只需要根据规格键的提示,填入商品相应的参数值即可。

Web实战——电商项目_第13张图片

实践过程

(1) 实现规格参数类目分页查询业务

  • 实现过程与“商品分页查询”相似。

Web实战——电商项目_第14张图片

(2) 实现规格参数类目新增业务

项目 规格参数类目新增业务接口
请求方法 POST
URL http://localhost/item/param/save/{item_cat_id}
参数 paramData // 规格参数类目
示例 http://localhost/item/param/save/569

paramData:
[{“group”:“主体”,“params”:[“品牌”,“颜色”,“型号”]},
{“group”:“耳机规格”,“params”:[“音频接口”,“接口类型”,“线控功能”]}]
返回值 {“status”:200,“data”:null,“msg”:null}
数据表 tb_item_param

Web实战——电商项目_第15张图片
Web实战——电商项目_第16张图片

(3) 实现规格参数类目修改业务

  • 实现过程与规格参数类目新增业务相似,只不过在数据访问层一个是向数据库插入,一个是对数据库修改。

(4) 实现规格参数类目删除业务

  • 实现过程与商品删除业务类似,不过规格参数类目删除在数据访问层也是真正的删除。

(5) 实现规格参数类目根据商品类目 id 查询业务(在新增商品时用到)

项目 规格参数类目分页根据商品类目 id 查询业务接口
请求方法 GET
URL http://localhost/item/param/query/itemcatid/{tb_item_cat_id}
参数
示例 http://localhost/item/param/query/itemcatid/560]
返回值 {“status”:200,
“data”:
  {“id”:2,
  “itemCatId”:560,
  “created”:1428028812000,
  “updated”:1428028812000,
  “paramData”:"[{“group”:“主体”,“params”:[“品牌”,“型号”,“颜色”,“上市年份”]},{“group”:“网络”,“params”:[“4G网络制式”,“3G网络制式”,“2G网络制式”]},{“group”:“存储”,“params”:[“机身内存”,“储存卡类型”]}]"},
“msg”:null}
数据表 tb_item_param

Web实战——电商项目_第17张图片

相关技术

  • JSON(规格参数类目信息 paramData 在数据库中以 JSON 字符串形式存储)

7 后台系统——内容管理模块

模块说明

  • 内容管理模块/系统(CMS Content Management System)是主要对一些广告内容的管理,主要实现内容类目的树状查询、新增、修改和删除,内容的分页查询、新增、修改和删除。
  • 从此处开始,简单的 CURD (Create Update Retrieve Delete 增删改查)的业务,便不再给出业务接口;并且后文着重介绍业务的实现思路和使用到的新技术。

实践过程

(1) 实现内容类目的树状查询、新增、修改和删除

Web实战——电商项目_第18张图片

(2) 实现内容的分页查询、新增、修改和删除

Web实战——电商项目_第19张图片

相关技术

  • 无新增技术

8 前台系统——电商门户模块(一)

前台系统说明

(1) 前台系统

  • 前台系统是与用户交互服务平台。本次实践仅实现 电商门户模块商品搜索模块商品详情模块注册登录模块购物车管理模块订单提交模块 的功能。

Web实战——电商项目_第20张图片

(2) 相关的数据

用户信息 订单信息
tb_user tb_order
tb_order_item
tb_order_shopping

(3) 需要实现的业务

电商门户模块 商品搜索模块 商品详情模块 注册登录模块 购物车管理模块 订单提交模块
门户导航菜单
大广告显示
商品搜索 商品基本信息显示
商品描述信息显示
商品规格参数信息显示
用户注册
单点登录
登录验证
购物车新增商品
购物车显示商品
购物车修改商品数量
购物车删除商品
登录验证
新增
订单确认
订单提交

模块说明

  • 电商门户模块(一)中主要实现 门户导航菜单业务

实践过程

(1) 创建 ego-item 和 ego-portal 两个工程模块

  • ego-item:商品展示项目,war 类型,地址 http://localhost:8081/ ,前台系统中商品的基本信息(tb_item)、描述(tb_item_desc)、规格参数(tb_item_param_item)、类目(tb_item_cat)相关的业务都在 ego-item 中实现。
  • ego-portal:门户项目,war 类型,地址 http://localhost:8082/ ,被访问时显示前台页面(index.jsp)。

(2) 实现门户菜单导航业务

  • 实现门户导航菜单业务的思路是在 ego-portal 的 index.jsp 中跨域访问 ego-item 的控制器,由 ego-item 去调用 Dubbo 服务去查询商品类目数据,查询完再将数据返回给 ego-portal 的 index.jsp 显示。
  • 跨域访问:一个 Servlet 容器(Tomcat)中的项目访问另一个 Servlet 容器(Tomcat)中的项目。ego-portal 和 ego-item 实际会被部署在不同的主机中,自然存在于不同的 Servlet 容器。
  • ajax 在研发时出于安全性考虑不允许跨域请求,准确来说是通过 ajax 跨域访问时,若对方控制器的返回值是字符串流或 json 数据,则无法获取返回值。
  • jsonp 是 ajax 实现跨域请求的解决方案。通过 ajax 跨域访问时,若对方控制器的返回值是 js 文件,则可正常接收返回值。因此,jsonp 的核心思路是将对方控制器的返回结果伪装成 js 文件。
  • 另一种解决跨域访问的方法是: ego-portal 的 index.jsp 中通过 ajax 访问自己的控制器,自己的控制器再访问自己的服务层,在服务层中使用 httpclient 调用 ego-item 的控制器。

Web实战——电商项目_第21张图片

相关技术

  • jsonp(实现跨域访问)

9 前台系统——电商门户模块(二)

模块说明

  • 电商门户模块(一)中主要实现 门户页面大广告显示业务
  • 由于门户页面中的大广告使用频率比较高,频繁的与 MySQL 数据库交互会影响性能,因此使用 Redis 在服务器内存中缓存大广告数据以提高性能。

实践过程

(1) 搭建 Redis 集群

  • 安装 6 个 Redis ,一主一备模式下共 3 个有效 Redis 构成集群(主机和备用机中数据是同步的,主机宕机后备用机来顶替)。
  • 由于笔者电脑性能限制,将 6 个Redis 安装在了一台主机上,通过端口号区分 7001-7006 。

(2) 创建 ego-redis 项目

  • jar 类型,基于客户端工具 Jedis 实现对 Redis 数据库的增删改查、判断key是否存在、设置key过期时间等功能,相当于面向 Redis 数据库的数据访问层。

(3) 实现门户页面大广告显示业务

  • 若不使用 Redis ,显示大广告的过程是:
    • 客户端访问 http://localhost/ ,服务器并没有直接返回 ego-portal 中的 index.jsp,而是先去获取大广告图片的数据(主要是 URL)。
    • 服务器请求 Dubbo 服务根据大广告 id 从 MySQL 数据库中查询 tb_content 数据表。
    • 将查询结果转化为 json 字符串通过 Request 作用域传给 index.jsp,并 index.jsp 页面内容返回给客户端。
  • 使用 Redis 后,服务器获取大广告图片的数据时会先根据大广告的键查询 Redis 中是否存在大广告缓存。
    • 若存在,直接从 Redis 缓存中查询大广告数据。
    • 若不存在,先调用 Dubbo 服务从 MySQL 数据库中查询,再把查询结果转化成 json 字符串存入 Redis 缓存。

Web实战——电商项目_第22张图片

相关技术

  • Redis(集群、Jedis)

10 前台系统——商品搜索模块

模块说明

  • 商品搜索模块主要实现 商品搜索业务
  • 商品搜索功能的通过 Solr 实现。
    • Solr 是一个 war 项目,可以在 Tomcat 服务器中运行;
    • Solr 可以存储数据,并可以在存储的数据中进行拆词检索;MySQL 是顺序查询,而 Solr 是基于索引查询,检索效率更高。
    • SolrJ 是操作 Solr 的 API,可以实现增删查改。
    • Solr 中的数据是以 SolrDocument 对象的形式存储的,可以在配置文件中自定义 SolrDocument 类中的属性及类型。每次新增相当于存储了一个 SolrDocument 对象。
    • Solr 实现搜索主要有两个过程,一个是拆词,一个是检索。但 Solr 默认中文拆词效果不好,可使用 IK Analyzer 中文拆词器。在配置文件 schema.xml 中配置 IK Analyzer 后,SolrDocument 类的属性便多了一个可选类型,不妨将 IK Analyzer 对应的类型命名为 text_ik 。
    • 用户输入的搜索关键字肯定要进行拆词,同时需要在配置文件中指定对 SolrDocument 类中的哪几个属性检索,这几个指定的属性值也要进行拆词。

在这里插入图片描述

Web实战——电商项目_第23张图片

Web实战——电商项目_第24张图片

实践过程

(1) 搭建和配置 SolrCloud(集群)

  • Solr 运行在 Tomcat 服务器,安装了 4 Tomcat 服务器运行 Solr ,一主一备模式下有 2 个有效 Solr 构成集群。
  • 安装 3 个 zookeeper 管理 Solr 集群,1 个 zookeeper 作为 leader,另外 2 个 zookeeper 分别管理 2 个有效 Solr 。

在这里插入图片描述
Web实战——电商项目_第25张图片

  • 在配置文件 schema.xml 中定义商品的标题、卖点、价格、图片、类目、描述 6 个属性,并指明对哪几个属性进行拆词搜索。

Web实战——电商项目_第26张图片

(2) 创建 ego-search 工程模块

  • war 类型,地址 http://localhost:8083/ ,用于实现商品搜索相关业务。

(3) Solr 数据初始化

  • 由于 ego-manage 中没有提供 Solr 初始化按钮功能,只能在 ego-search 中编写初始化控制器,在浏览器访问进行初始化。
  • 初始化会调用 Dubbo 服务在 MySQL 中查询商品信息,然后将每一个商品信息封装到一个 SolrInputDocument 对象中,最后通过 SolrJ 都上传到 SolrCloud 中去。
  • 初始化过程可能需要几分钟的时间。

(4) 实现商品搜索业务

  • 在门户页面的搜索框键入关键字进行搜索,会向服务器发起 GET 请求 http://localhost:8083/search.html?q=魅族17pro 。
  • 服务器接收到该请求,会通过 SolrJ 进行查询。设置“魅族17pro”为查询字段,分页条件默认为显示第1页,每页显示12个商品信息,设置商品标题中进行查询高亮显示。
  • 服务器获取到搜索结果会通过 request 作用域传到 search.jsp 页面。最终服务器返回 search.jsp 页面,浏览器显示该页面内容。

Web实战——电商项目_第27张图片
Web实战——电商项目_第28张图片

相关技术

  • solr(集群、IK Analyzer、SolrJ)

11 前台系统——商品详情模块

模块说明

  • 商品详情模块主要实现 商品详情显示业务,该业务是在 ego-item 工程项目内完成的。
  • 需要显示的信息有商品基本信息(tb_item)、商品描述(tb_item_desc)和商品规格参数信息(tb_item_param_item)。

实践过程

(1) 实现商品基本信息显示业务

  • 在搜索结果页面点击商品图片或标题卖点文字便会在新浏览器新标签页发送 GET 请求 http://localhost:8081/item/159595186054710.html ,其中 159595186054710 是商品 id。
  • ego-item 控制器收到请求后,从Redis 和 MySQL 的搭配存储中获取商品基本信息,通过 Request 左右域传到 item.jsp 并向浏览器返回 item.jsp 页面内容。

Web实战——电商项目_第29张图片

(2) 实现商品描述显示业务

  • 浏览器接收并显示 item.jsp 页面内容(商品名称、卖点、价格、图片等用户最关注的基本信息已经正常显示),延迟1秒后通过 ajax 发起 GET 请求 http://localhost:8081/item/desc/159595186054710.html ,向服务器请求商品描述数据。
  • ego-item 控制器收到请求后,从Redis 和 MySQL 的搭配存储中获取商品描述信息,并以字符串的形式返回给 ajax,于是商品详情页面显示出来商品描述信息。
  • 说明:之所以商品描述信息没和商品基本信息一起查询,是考虑到了性能问题,一起查询会导致响应等待时间比较长;而且用户点开商品详情页面至少几秒钟内的注意力都在商品基本信息上。

Web实战——电商项目_第30张图片

(3) 实现商品规格参数显示业务

  • 点击“参数规格”,浏览器会通过 ajax 发送 GET 请求 http://localhost:8081/item/param/159595186054710.html ,向服务器请求商品规格参数信息。
  • ego-item 控制器收到请求后,从Redis 和 MySQL 的搭配存储中获取商品规格参数信息。如果是从 MySQL 中查询到信息是存储在对象中,先 jackson 转化为 JSON 字符串,再处理成合适格式的 HTML 字符串返回给 ajax,于是商品详情页面显示出来商品规格参数信息。

Web实战——电商项目_第31张图片

相关技术

  • jackson(对象和 JSON 字符串之间的转化)
  • HTML(网页描述语言)

12 前台系统——注册登录模块

模块说明

  • 注册登录模块主要是实现 单点登录业务用户注册业务
  • 单点登录(SSO Single Sign On)是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
  • 在单模块项目中,可以使用 HttpSession + Cookie 实现登录功能。但是在分布式项目中一个项目中有很多工程模块,HttpSession 仅在一个工程模块内有效,无法在多个模块之间共享登录状态。于是,可以将 HttpSession 替换成 Redis 。

实践过程

(1) 创建 ego-passport 工程模块

  • war 类型、地址 http://localhost:8084/ 。

(2) 实现单点登录业务

  • 跳转到登录页面的两种情况
    • 在网站的任意页面点击“登录”便会在新标签页发起 GET 请求 http://localhost:8084/user/showLogin ,原来的网址会以键值对的形式(redirect,url)通过 Request 作用域传递到要显示的 login.jsp 页面,登录成功后会再跳转回 url 页面。
    • 在商品详情页面点击“添加购物车”,若未登录也会跳转到登录页面。

Web实战——电商项目_第32张图片

  • 在登录页面输入账户密码点击“登录”,会向 ego-passport 发起 POST 请求 http://localhost:8084/user/login (数据部分 username=cty&password=123)请求。

    • ego-passport 控制层接收请求,转到服务层进行处理;
    • 服务层先调用 Dubbo 服务,以用户名和密码查询 tb_user 表,若查询结果为则向登录页面返回错误状态信息;若查询结果不为空,以新生成的 UUID 为键,查询结果的第一个 tbUser 对象的 JSON 字符串为值存入 Redis,同时生成 Cookie,以“TT_TOKEN”为键,以新生成的 UUID 为值,默认设置 7 天有效,通过 Response 作用域传递给浏览器,并向登录页面返回登录成功的状态信息。
    • 登录成功后会马上跳转回 redirect 代表的地址。
  • 登录成功后,若用户进入其他非 ego-passport 管理的页面,都会通过 jsonp 向 ego-passport 发送跨域 GET 请求 http://localhost:8084/user/token/52084c9e-7637-4c91-ba64-d1f63fb05110?callback=jQuery6188884&_=1596095943090 (52084c9e-7637-4c91-ba64-d1f63fb05110是 Cookie 中 TT_TOKEN 键对应的值)来获取用户登录信息,ego-passport 会以 52084c9e-7637-4c91-ba64-d1f63fb05110 为键,查询 Redis 中的用户信息,若查询成功将用户信息(一般会将密码抹去)返回。其他非 ego-passport 管理的页面便能获取用户的登录状态了。

Web实战——电商项目_第33张图片

  • 若用户点击“退出”,会通过 jsonp 向 ego-passport 发送跨域 GET 请求 http://localhost:8084/user/logout/52084c9e-7637-4c91-ba64-d1f63fb05110?callback=abc&_=1596096631987 ,ego-passport 会删除 Redis 中的用户缓存并清除 Cookie 。

(3) 实现用户注册业务

  • 在登录页面点击“注册”会向 ego-passport 发起 GET 请求 http://localhost:8084/user/showRegister ,从而跳转到 register.jsp 页面。

Web实战——电商项目_第34张图片

  • 填入注册信息后,点击“立即注册”,会向 ego-passport 发送 POST 请求 http://localhost:8084/user/register (数据部分 username=cty1&password=111&pwdRepeat=111&phone=123456)。ego-passport 会调用 Dubbo 服务验证是否用户名已经存在,会校验 password 是否符合要求且是否和 pwdRepeat 一致,会校验手机号是否正确(该功能未实现)。若都没问题则提示注册成功,点击确认跳转到登录页面。

相关技术

  • SSO(Redis + Cookie 实现)

13 前台系统——购物车管理模块

模块说明

  • 购物车管理模块中主要实现 登录验证业务购物车中商品的增删查改的业务

实践过程

(1) 创建 ego-cart 工程模块

  • war 类型,地址 http://localhost:8085/ 。

(2) 实现登录验证业务

  • 拦截器主要实现登录验证。
  • 只要是发送到 ego-cart 的请求 url 都会先进入拦截器,通过 HttpClient 向 ego-passport 发起 POST 请求 http://localhost:8084/user/token/{token} 来验证是否已经登录。若未登录会 ego-passport 发起 GET 请求 http://localhost:8084/user/showLogin?interurl=url ,待跳转网址会以键值对的形式(redirect,interurl)通过 Request 作用域传递到要显示的 login.jsp 页面,登录成功后会再跳转到 url 网址。

(3) 实现购物车新增商品业务

  • 在商品详情页面点击“添加购物车”,会向 ego-cart 发送 GET 请求 http://localhost:8085/cart/add/159595186054710.html?num=1 。
  • ego-cart 会先以 Cookie 中的 TT_TOKEN 键对应的值为键从 Redis 中获取用户信息,然后以 cart:username 为键查询 Redis 。若已经存在购物车数据且该商品已经存在,将该商品数据增加后,覆盖原来的购物车信息;若已经存在购物车数据且该商品不存在,调用 Dubbo 服务查询该商品的基本信息(只用到 id、标题、图片和价格,查询 tb_item 表即可)并添加到原来的购物车数据上;若购物车数据不存在,则直接调用 Dubbo 服务查询商品信息并存入 Redis 。
  • 添加购物车成功会跳转到 cartSuccess.jsp 页面。

Web实战——电商项目_第35张图片

(4) 实现购物车显示商品业务

  • 添加购物车成功页面中点击“去购物车结算”,会向 ego-cart 发送 GET 请求 http://localhost:8085/cart/cart.html 来查询购物车信息。
  • ego-cart 会先以 Cookie 中的 TT_TOKEN 键对应的值为键从 Redis 中获取用户信息,然后以 cart:username 为键查询 Redis 。然后将查询结果从 JSON 字符串转化为对象,通过 Request 作用域传到 cart.jsp 页面,最后将页面返回给浏览器。

Web实战——电商项目_第36张图片

(5) 实现修改购物车中商品数量业务

  • 在购物车显示页面中点击某个商品数量一栏的“-”号,会通过 ajax 向 ego-cart 发送 POST 请求 http://localhost:8085/cart/update/num/159595186054710/1.action 。
  • ego-cart 会先以 Cookie 中的 TT_TOKEN 键对应的值为键从 Redis 中获取用户信息,然后以 cart:username 为键查询 Redis 。从查询结果中找到指定商品,修改更新后的商品数量,并写回 Redis ,最后向 ajax 返回修改后的购物车信息。

Web实战——电商项目_第37张图片

(6) 实现删除购物车中的商品业务

  • 在购物车显示页面中点击某个商品操作一栏的“删除”,会通过 ajax 向 ego-cart 发送 POST 请求 http://localhost:8085/cart/delete/158908158193865.action 。
  • ego-cart 会先以 Cookie 中的 TT_TOKEN 键对应的值为键从 Redis 中获取用户信息,然后以 cart:username 为键查询 Redis 。从查询结果中找到并删除指定商品,接着写回 Redis ,最后向 ajax 返回删除后的购物车信息。

Web实战——电商项目_第38张图片

相关技术

  • Servlet(拦截器)

14 前台系统——订单管理模块

模块说明

  • 订单管理模块主要实现

实践过程

(1) 创建 ego-order 工程模块

  • war 类型,地址 http://localhost:8086/ 。

(2) 实现登录验证业务

  • 在购物车页面点击“去结算”,跳转到订单确认页面前也需要进行登录拦截验证。

Web实战——电商项目_第39张图片

(3) 实现订单确认业务

  • 假设登录验证已经通过,发送到 ego-order 的 GET 请求 http://localhost:8086/order/order-cart.html?id=159595186054710&id=158927755536120 已经被控制器接收。
  • 订单确认主要是验证库存量是否满足用户的购买量。服务层会分别从 Redis 缓存中查询用户的购物车中各商品的购买数量,也会调用 Dubbo 服务根据商品 id 在 tb_item 表中查询商品的库存数量。并将判断结果同以及购物车商品信息都通过 Request 作用域传递到 order-cart.jsp 页面。
  • 小米电子阅读器库存只剩下 1 件,当购买 2 件时会在订单确认页面显示“无货”;而当将购买数量改为 1 件时在订单确认页面显示“有货”。

Web实战——电商项目_第40张图片

Web实战——电商项目_第41张图片

(4) 实现订单提交业务

  • 在订单确认页面点击“提交订单”,会向 ego-order 发送 POST 请求 http://localhost:8086/order/create.html ,数据部分如下图所示:

Web实战——电商项目_第42张图片

  • 用 TbOrder 对象接收 payment 和 paymentType,并存入用户注册 id 和昵称;用 TbOrderItem 类型的列表接收 itemId、num、title、price、totalFee 和 picPath ;用 TbOrderShipping 对象接收用户地址信息。接下来要进行的操作有:
    • 调用 Dubbo 服务,将接收数据新增到 tb_order、tb_order_item 和 tb_order_shipping 数据表中。
    • 删除 Redis 中的用户购物车缓存数据。
    • 更新 MySQL 中商品库存数量。
    • 将订单号、付款金额和预计送达时间信息通过 Request 作用域传递到 success.jsp ,并将该页面返回给浏览器。

Web实战——电商项目_第43张图片

相关技术

  • 无新增技术。

你可能感兴趣的:(Java,EE,Java,Web,项目,后端)