Skip to content
分布式商城项目
Java Other
  1. Java 99.7%
  2. Other 0.3%
Branch: master
Clone or download

README.md

pinyougou-mall

分布式商城项目

分布式商城项目总结

image

一、商家管理后台

商家审核、品牌管理、规格管理、模版管理、商品分类管理、商品审核、广告类型管理、广告管理、订单查询、商家结算

image

1.品牌管理模块功能
品牌的分页查询、品牌的增删改查、品牌的条件查询
2.规格模板的管理
规格的增删改查
3.为什么使用模板

1.用模板将规格和品牌关联起来

2.定义一些扩充的属性

4.品牌下拉列表的实现?

使用select2组件

二、安全框架和商家入驻审核

  • 使用Spring Security做安全框架
  • 运营商的登录以及安全控制

    在主页面显示登陆人

  • 商家申请入驻

    商家申请入驻,需要填写商家有关的信息,待运营商平台审核通过后即可使用

  • 运营商管理后台对商家进行审核

    状态值:0:未审核 1:已审核 2:审核未通过 3:关闭

  • 商家系统登录与安全控制

完成商家系统的登录和安全控制,商家账号来自数据库,并对密码进行加密(使用BCrypt算法)

用户表的密码通常使用MD5等不可逆算法加密后存储,为防止彩虹表破解更会先使用一个特定的字符串(如域名)加密,然后再使用一个随机的salt(盐值)加密。 特定字符串是程序代码中固定的,salt是每个密码单独随机,一般给用户表加一个字段单独存储,比较麻烦。 BCrypt算法将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独处理salt问题。

显示登陆名和退出登陆

三、商品管理

1、商品的录入功能

a.商品运营商管理平台-商品管理-商品分类管理

新建分类、删除分类、查询分类的下级

b.SPU和SKU的设计

SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。 通俗点讲,属性值、特性相同的商品就可以称为一个SPU。

iphone7就是一个SPU,与商家,与颜色、款式、套餐都无关。**

SKU即库存进出计量的单位, 可以是以件、盒、托盘等为单位。 SKU是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。在服装、鞋类商品中使用最多最普遍。

纺织品中一个SKU通常表示:规格、颜色、款式。

c.富文本编辑器

这里使用的是kindeditor

d.文件上传服务器FastDFS

Fastdfs 图片服务器搭建时候的遇到的坑

版本问题!!!!!被坑了一天!一定要注意各个环境的版本

e.anjularjs图片上传

f.商品录入时候分类功能

三级联动、品牌选择、扩展属性、规格选项、SKU信息,进行商品的录入

2、商品的修改和审核

在商家后台,显示该商家商品列表的功能

显示商品的审核状态、商品的分类信息、商品的详情信息、点击修改按钮可以实现对商品详细数据的修改

运营商后台-商品管理模块

实现对商品的删除(逻辑删除,设置一个标志位)、对商品的审核、商品的上下架

注解式事务

四、广告管理和缓存

1.运营商后台 广告类型管理和广告管理(广告管理中涉及到广告图片的上传)
2.网站首页 广告内容的显示

我们目前的系统已经实现了广告后台管理和广告前台展示,但是对于首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪。那如何解决呢?我们通常的做法有两种:一种是数据缓存、一种是网页静态化。我们今天讨论第一种解决方案。

3.用redis做缓存 使用spring-data-redis. redisTemplate对redis进行了高度的封装

缓存对于整个的系统来说是一个通用的功能,所以我们把他放在pinyougou-commin中去

对缓存的更新:

当广告数据发生变更的时候,将缓存的数据清除掉,这样再次查询才能获取最新数据

修改广告、增加广告、删除广告都需要清除缓存

五、搜索服务

1.使用solr http://localhost:8080/solr/#/collection1/query

使用spring data solr,底层是对solrJ的封装

2.商品数据建立索引导入索引库
3.搜索的业务规则

在关键字搜索的基础之上添加一个面板搜索

(1)当用户输入关键字搜索后,除了显示列表结果外,还应该显示通过这个关键字搜索到的记录都有哪些商品分类。

(2)根据第一个商品分类查询对应的模板,根据模板查询出品牌列表

(3)根据第一个商品分类查询对应的模板,根据模板查询出规格列表

(4)当用户点击搜索面板的商品分类时,显示按照这个关键字查询结果的基础上,筛选此分类的结果。

(5)当用户点击搜索面板的品牌时,显示在以上结果的基础上,筛选此品牌的结果

(6)当用户点击搜索面板的规格时,显示在以上结果的基础上,筛选此规格的结果

(7)当用户点击价格区间时,显示在以上结果的基础上,按价格进行筛选的结果

(8)当用户点击搜索面板的相应条件时,隐藏已点击的条件。

实现的一个思路

(1)搜索面板的商品分类使用Spring Data Solr的分组查询来实现

(2) 为了提高查询的速度,我们把需要查询面板的品牌、规格数据提前放入redis

(3)查询条件的创建和面板的隐藏需要用angularJS来实现

(4)后端的分类、品牌、规格、价格区间查询需要使用过滤查询来实现

5.缓存品牌和规格的数据

将商品分类数据、品牌数据、以及规格数据放入redis进行存储

(1)当用户进入运营商后台的商品分类页面时,将商品分类数据放入缓存(Hash)。以分类名称作为key ,以模板ID作为值

(2)当用户进入运营商后台的模板管理页面时,分别将品牌数据和规格数据放入缓存(Hash)。以模板ID作为key,以品牌列表和规格列表作为值。

6.实现按照价格区间筛选、搜索结果分页、多关键字搜索
7.对索引库的更新

在进行商品审核后更新到solr索引库,在商品删除后删除solr索引库中相应的记录.

六、用FreeMarker做网页静态化

对于电商网站的商品详细页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决。

网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。

另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百。FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。

静态化处理后的商品详情页可以放在nginx上。

七、消息中间件解决方案JMS

1.商品审核-导入solr索引库

a.运用消息中间件实现运营商后台与搜索服务的零耦合,运营商执行商品审核后,向activeMQ发送消息(SKU列表),搜索服务从activemq接收消息并且导入索引库。

b.通过消息中间件实现在商品删除的时候同时也移除索引库记录

2.商品审核-执行网页静态化

a.运用消息中间件activemq实现运营商后台和网页生成服务的零耦合。运营商执行商品审核后,向activemq发送消息(商品id),网页生成服务从activemq中接收到消息后执行网页生成操作。

b. 执行商品删除后,同时删除每个服务器上的商品详情页

3.使用activemq加入短信发送微服务

用户注册功能,短信验证码验证

八、购物车解决方案

当用户在未登录的情况下,将此购物车存入cookies , 在用户登陆的情况下,将购物车数据存入redis 。如果用户登陆时,cookies中存在购物车,需要将cookies的购物车合并到redis中存储. image

redis存购物车

判断当前用户是否登陆,如果未登录采用Cookie存储,如果登录则采用Redis存储。登录后要进行Cookie购物车与Redis购物车的合并操作,并清除Cookie购物车。

九、秒杀解决方案(并不完善,需要优化)

秒杀商品通常有两种限制:库存限制、时间限制。

需求:

(1)商家提交秒杀商品申请,录入秒杀商品数据,主要包括:商品标题、原价、秒杀价、商品图片、介绍等信息

(2)运营商审核秒杀申请

(3)秒杀频道首页列出秒杀商品(进行中的)点击秒杀商品图片跳转到秒杀商品详细页。

(4)商品详细页显示秒杀商品信息,点击立即抢购实现秒杀下单,下单时扣减库存。当库存为0或不在活动期范围内时无法秒杀。

(5)秒杀下单成功,直接跳转到支付页面(微信扫码),支付成功,跳转到成功页,填写收货地址、电话、收件人等信息,完成订单。

(6)当用户秒杀下单5分钟内未支付,取消预订单,调用微信支付的关闭订单接口,恢复库存。

十、SpringTask实现任务调度

a.每分钟执行查询秒杀商品表,将符合条件的记录并且缓存中不存在的秒杀商品存入缓存

b.每秒中在缓存的秒杀上皮列表中查询过期的商品,发现过期同步到数据库,并在缓存中移除该秒杀商品.

You can’t perform that action at this time.