前面内容请移步
基于 SpringCloud 的在线交易平台乐优商城的设计与实现(四)
相关免费源码资源
第 5 章系统设计
本章在前章需求分析和概要设计的基础上 ,通过流程图 、类图、时序 图等方式介绍了该电商平台的详细设计与实现过程, 包括商家后台详细设计 与实现、前台详细设计与实现和系统集群详细设计与实现。
5.1 商家后台详细设计与实现
通过第 4 章的需求分析,我们知道,商家后台系统主要包括商品管理、 分类管理、品牌管理、规格管理等五项功能。具体功能包括哪些内容 己在 3.3.1 小节功能需求分析中详细阐明,这里不再赘述。商家后台业务执行流 程图如图 5-1 所示:
图 5-1 商家后台业务执行流程图
通过商家后台业务执行流程图可以得出 ,商家首先访问后台登录界面, 成功登录后就可以对商品、分类、品牌、规格和规格参数进行管理 ,管理 完成后还可以安全退出商家后台。
涉及商品管理的控制层类BrandController类、GoodsController 类、CategoryController 类、 SpecController 类 。负责品牌和分类管理的是 BrandController 和 CategoryController。与商品管理有关的是 GoodsController,包括商品、商品详情、商品 SKU 的管理。与规格参数有关的是 SpecController, 其中包括了规格组管理和规格参数管理。在服务层, 有与控制层对应的类进行业务逻辑处理 。持久层类通过操作实体对象操作数据库 。
下面以商品管理中的修改商品和品牌管理中的新增品牌为例进行详细说明 。
5.1.1. 修改商品
商家登录管理后台后, 需要下架商品, 然后就可以修改商品。修改完成 并提交到后台后, 后台完成数据校验, 写入数据库, 完成商品修改。商品修改时序图见图 5-2:
图 5-2 商品修改时序图
修改商品是对下架商品做参数修改。商家可以修改的参数包括: 商品名 称、标题、商品描述、商品包装清单、商品售后服务、商品规格参数等。除 此之外,商家还可以修改商品包含的 SKU 信息,例如:商品价格、库存、 图片。商家还可以添加新的 SKU 或者删除一个 SKU。当商家点击保存商品 时,需要对用户修改的数据做检查, 将被修改的部分提交到服务端。如Sku 有新增、修改、删除并存,需要加以区分: sku 中包含 saleable 的为删除;sku 中不包含 saleable 并且有 id 的是修改; sku 中不包含 saleable 并且没 有 id 是新增。另外服务端要校验商品 spu 中的 saleable 字段, 这个字段是代 表上下架, 在修改商品时是不允许修改的。当商品修改完毕,商家验证通过后再完成提交。
商家后台商品修改的界面如图 5-3 ,5-4 所示。
图 5-3 商品修改后台页面
图 5-4 商品修改后台页面
5.1.2. 新增品牌
品牌管理是对平台的商品品牌进行管理 ,包括对平台所有品牌的查询 、 增加、 修改和删除 ,当该平台需要引入新的品牌时,可以使用新增品牌功能增加新的品 牌,新增品牌时序图如图 5-5 所示。
图 5-5 新增品牌时序图
商家点击品牌管理界面的 "新建" 按钮 ,进入新增品牌页 ,新增品 牌需要 填写品牌名称、品牌首字母、关联的商品分类及品牌图片等信息, 当点击"保存"后,前端会把商家输入信息封装成对象传递给 BrandController 类的 save()方法, BrandController 类的 save()方法再把对象传递给将服务层 的 save()方法 ,服务层 save() 方法再调用持久层的 insert()方法将对象保存 到数据库的品牌表中,这样就完成了商品品牌的增加。
商家后台新增品牌界面如图 5-6 所示。
图 5-6 商家后台新增品牌界面
5.2. 前台详细设计与实现
前台面向的是用户 ,前台包含的七个子模块己在 3.3.2 小节前台功能 需求分析中阐述, 这里不在赘述 。用户首先访问门户首页 ,门户首页向用 户展示商品分类、广告轮播图 、商品广告 、搜索入口和秒杀入口 等。接 着用户可以在门户首页 根据关键宇搜索商品 ,搜索到结果后用户还能够在 搜索面板设置不同的过滤条 件, 以达到更精准的搜索结果 ,同时还能够对 搜索结果按照一定规则进行排序 。用户点击搜索结果中的某个商品就能进 入到该商品 的商品详情页, 在商品详情 页,用户能够看到与商品有关的详 细信息 ,包括标题、价格、规格等信息 。用户 选择完商品和数量之后点 击加入购物车按钮就能把指定的商品和数量加入到购 物车当中 。在购物车 中 ,用户可以对购物车添加 、修改和删除 ,并且己登录的用 户可以对购 物车的商品进行结算 ,在结算页面选择收货人信息 和支付方式就能够 提 交订单 ,提交订单后用户需要完成在线支付。个人中心主要包含用户注册 和个人信息维护功能、订单查询功能。网站前台业务执行流程图如图 5-7 所示。
图 5-7前台业务执行流程图
5.2.1. 搜索功能详细设计与实现
门户首页是用户首先访问的页面 ,而首页最重要的就是商品搜索入口。 商品搜索是一种站内搜索功能 ,面向的使用者是用户。该电商平台为用户 提 供了快捷方便的商品搜索功能。商品搜索主要包含关键字搜索、动态搜 索过滤条件展示、条件过滤筛选、分页、结果高亮、搜索结果排序等功能。
商品首页见图 5-8
图 5-8 商品前台首页
用户在搜索框内输入一个或多个关键字 ,点击搜索按钮后会将搜索结 果列表展示给用户,同时用户可以通过搜索面板的商品分类 、商品品牌、 规格和价格区间等条件对搜索 结果进行进一步筛 选,也可以对搜索结果按照价格 、销量等进行排序 。
在搜索商品时, 如果使用传统的数据库查询方式搜索会导致在高并发情 况下 搜索性能低下,甚至出现系统瘫痪 。所以 ,本文设计的商品搜索功 能需要搭建 elasticsearch 集群,并通过 WebFlux 响应式编程,实现对 elasticsearch 的异步查询,形成一个异步的 web 服务。当用户搜索商品时 ,搜索服务会根据关键宇向索 引库中查询商品,而不再向数据库查询 。
当后台商家对商品修改时, 还需要利用 MQ 技术实时通知搜索服务, 完 成索引库数据与数据库数据的同步,确保双写一致性。
商品搜索的具体实现过程如下 :
(1) 建立商品索引库
(2) 将商品数据导入索引库中
(3) 用户输入搜索关键字、点击搜索过滤条件或排序条件,前端提交参数到 搜索服务
(4) 搜索服务组织搜索条件,向 elasticsearch 发起查询
(5) elasticsearch 利用倒排索引,在索引库中查询商品并返回给搜索服务器
(6) 搜索服务器将商品返回页面,页面完成渲染
建立商品索引库过程如下 :
1)搭建 elasticsearch 集群
2)配置中文分词器,这里是使用 IK Analyzer
3)设置索引库数据结构
4)查询数据库数据,封装成索引库结构,写入索引库
第一步和第二部由于篇幅原因不再展开叙述 ,第三步索引库商品数据结构
设计表如表 5-1 所示:
表 5-1 商品搜索域设计表
|------------|------------|------|------|----------|
| 字段名称 | 字段类型 | 是否索引 | 是否存储 | 字段描述 |
| id | long | 是 | 是 | 唯一标示 |
| title | text | 是 | 是 | 标题 |
| image | keyword | 否 | 是 | 商品图片 |
| suggestion | completion | 是 | 否 | 自动补全 提 示 |
| categoryId | long | 是 | 否 | 分类 id |
| brandId | long | 是 | 否 | 品牌 id |
| specs | nested | 是 | 否 | 规格过滤项 |
| prices | long | 是 | 是 | 价格 |
| sold | long | 是 | 是 | 销量 |
| updateTime | Date | 是 | 否 | 更新时间 |
设置好商品索引库结构后 ,基于 SpringBoot 编写 elasticsearch 的工具 类,将 elasticsearch 的操作封装为一个自动配置的 starter 。在搜索服务中调 用该工具,将商品表中上架状态的(saleable 为 1)的商品查询出来,最后 将查询出的商品明细数据封装, 并导入到 elasticsearch 索引库,这样该电商平台的商品索引库就建立完成 。
下面以关键宇搜索为例进行详细说明, 关键字搜索是指用户在搜索框内输入 搜索关键字, 点击搜索按钮后会将搜索结果列表展示给用户, 关键字搜索类图如图 5-9 所示。
图 5-9 关键字搜索类图
关键字搜索时序图如图 5-10 所示。
图 5-10 商品搜索时序图
与关键字搜索有关 的类包括 SearchController 类、SearchServicelmpl 类 和 Elasticsearch 工具 GoodsRepository,使用 GoodsRepository 能够对索引库进行增删改查 。用户在 门户首页或搜索页的搜索框内输入搜索关键字, 点 击搜索 ,前端会发送搜索请求到服务端,服务端接收请求,调用 SearchController 类的 search() 方法并将搜索参数传递给该方法 ,接着 SearchController 类的 search()方法会调用 SearchService 的 search()方法并把 关键宇参数传递给该方法 ,在 SearchService 的 search()方法中,首先根据 关键字参数添加查询条件,再判断是否有过滤条件、排序条件、分页条件、 高亮条件等。调用 GoodsRepository 的 queryForPage()方法 将符合条件的结 果查询出来 。最后将结果封装到 Mono<PageInfo>这个异步对象中返回到 前端页面 。
商品搜索界面如图 5-11 所示:
图 5-11 商品搜索界面
5.2.2. 用户注册功能
新用户可以通过注册成为会员, 注册成功后可以登录用户中心对个人信 息进行查询和修改。本小节首先介绍用户中心的类图, 然后分别介绍用户注 册和个人信息 维护功能的具体实现过程 。用户中心类图如图 5-12 所示。
图 5-12 用户中心类图
如用户中心类图所示 ,主要包括的类分别是 UserController 类、UserService 和 UserMapper 接口 。
UserController 类是控制层类, 负责业务模块流程的控制 ,它连接前端 和后端 ,接收前端的请求 ,并向后端发送请求。 UserService 类是服务层 实现类 ,负责用户中心各功能的具体业务逻辑实现。UserMapper 接口是用 户实体类的数据库接口,在 UserMappe 接口中定义了若干方法对数据库中 的用户表 tb_user 进行操作 。
接下来分别介绍用户注册和登录的 具体实现过程 。
(1)用户注册
用户注册时需要在注册页填写相关的注册信息 ,包括用户名 、登录密 码 、手机号和短信验证码 。用户首先需要填写用户名、登录密码和手机号, 然后点击获取验证码就能在于机上获取到短信验证码 ,最后输入短信验证码再点击注册就能完成用户注册功能 。
用户注册时序图如图 5-13 所示。
图 5-13 用户注册时序图
完成用户注册可以分为两个步骤,第一步是获取动态验证码 ,第二步是填写 验证码进行注册 ,下面分别介绍两个步骤 。
第一步: 在用户注册页, 用户输入用户名、密码和手机号后, 点击获取 验证 码按钮,就会调用 UserController 类的 sendCode()方法并接收用户输 入的手机号, 该 sendCode() 方 法 会 调 用 UserService 类 的 sendCode() 方法。在 sendCode ()方法中首先随机生成一个 6 位验证码 ,然后将此验证 码以此机号为 key 存入到 Redis 中, 并将该验证码发送给消息中间件 RabbitMQ ,最后短信微服务接收到来自 RabbitMQ 的短信验证码并调用阿 里大于短信发送平台将该验证码发送到用户的手机上。
第二步 :用户手机收到短信验证码后 ,将验证码填入到注册页 ,点 击注册, 会调用 UserController 类的 register()方法并接收用户输入的 账 户、密码、手机号和短 信 验 证 码 。UserController 类的 register ()方法首 先会调用 UserServiceImpl 类的 register()方法。 register()方法中,将 Redis 中存有的验证码与用户输入的验证码进行匹配, 如果不一致则提示用户输入 的验证码有误;如果一致将用户注册信息添加到数据库表 tb_user 中。
用户注册界面如图 5-14 所示。
图 5-14 用户注册页面