需求分析
1024商城采用分布式架构部署的一个大型网上商城系统,类似于京东商城。本系统分前台系统和后台系统。前台系统主要负责商城的页面的显示功能,这里采用的面向服务的方式,pc端手机端只负责显示页面,业务逻辑都在服务层实现,客户端调用服务端接口来实现显示功能。
系统采用分库,分模块设计,
优惠券模块:
- 优惠券记录服务
分页查询领劵记录 、加锁优惠券、 释放优惠券、根据领劵id查找详情 - 优惠券服务
分页查询优惠券、领券接口、新用户注册领券
订单模块:
- 订单服务
创建订单、查询订单状态、定时关闭订单、分页查询我的订单、订单二次支付、支付结果回调通知
用户模块:
- 用户服务
发送邮件验证码、检验邮件验证码、登录服务、注册服务、图形验证码服务、查看用户详情、上传图片 - 地址服务
新增收货地址、根据id删除收货地址,收货地址列表、收货地址详情
网关模块:
- 网关
负责转发服务
商品模块
-
商品记录服务
锁定商品库存、恢复商品库存、根据id查找商品详情、根据id批量查找商品详情、分页查找商品列表 -
购物车服务
添加购物车、清除购物车、查看我的购物车、删除购物项、修改购物车商品数量、确认购物车商品信息 -
轮播图服务
轮播图列表服务
普通模块
-
配置
swagger配置、redisson的配置、mybatisplus分页插件的配置 -
枚举
地址状态、异常状态、客户端类型、优惠券类别、优惠券状态、优惠券发布状态、订单支付类型、订单状态类型、订单类型、库存状态、发送验证码类型 -
异常
自定义异常、总的系统异常、流量异常 -
固定值
CahceKey: 注册验证码 code:%s:%s 、购物车 cart:%s 、提交表单 order:submit:%s
TimeConstant:订单支付有效时间 -
工具
判断是邮箱或者手机符合规则
JsonData工具
JWT登录权限校验工具
CommonUtil工具 ,生成需要长度的数字,md5加密,得到当前时间轴,获取ip,响应object给前端
###调用模式
-
用户服务:
发放优惠券 -
优惠券服务:
查询订单状态 -
订单服务
锁定优惠券
查看优惠券是否可用
查询用户地址防止越权设计
锁定商品库存
确定商品
获取商品最新的价格 -
商品服务
查询订单状态
数据库设计
- 用户数据库设计
user表
字段名字 | 解释 |
---|---|
id | 自增主键 |
name | 姓名 |
sex | 性别 |
head_img | 头像 |
point | 积分 |
slogan | 用户签名 |
create_time | 创建时间 |
pwd | 密码 |
secret | 敏感字段加密 |
邮箱 |
address表
字段名字 | 解释 |
---|---|
id | 自增主键 |
user_id | 用户的id |
default_status | 是否为默认收货地址 |
recevice_name | 收货人姓名 |
phone | 手机号码 |
province | 省/直辖市 |
city | 市 |
region | 区 |
detail_address | 详细地址 |
create_time | 创建时间 |
- product数据库设计
轮播图设计
字段名字 | 解释 |
---|---|
id | 自增id |
img | 图片 |
url | 跳转地址 |
url | 权重 |
product设计
字段名字 | 解释 |
---|---|
id | 自增id |
title | 标题 |
cover_img | 封面图 |
detail | 详情 |
old_amount | 老的价格 |
amount | 新的价格 |
stock | 库存 |
create_time | 创造时间 |
lock_stock | 锁定库存 |
product_task设计
字段名字 | 解释 |
---|---|
id | 自增主键 |
buy_num | 购买数量 |
product_name | 商品名字 |
lock_state | 锁定状态 |
create_time | 创造时间 |
out_trade_no | 订单号 |
product_id | 商品id |
- coupon数据库设计
coupon表
字段名称 | 解释 |
---|---|
id | 自增 |
category | 类别 |
publish | 发布类型 |
coupon_title | 优惠券标题 |
coupon_img | 优惠券名称 |
price | 价格 |
user_limit | 用户限领张数 |
start_time | 生效时间 |
end_time | 过期时间 |
stock | 优惠券库存 |
create_time | 创建时间 |
publish_count | 发布张数 |
condition_price | 优惠券门槛 |
couponrecord表
表字段名 | 解释 |
---|---|
id | 自增主键 |
user_id | 用户id |
user_name | 用户名字 |
user_state | 用户使用状态 |
coupon_id | 优惠券id |
coupon_title | 优惠券标题 |
start_time | 开始时间 |
end_time | 结束时间 |
order_id | 订单id |
price | 抵扣价格 |
condition_price |
coupon_task表
表字段名 | 解释 |
---|---|
id | 自增主键 |
coupon_record_id | 领卷记录id |
lock_state | 锁定状态 |
out_trade_no | 订单号 |
create_time | 创建时间 |
order数据库设计
product_order
表字段名 | 解释 |
---|---|
id | 自增主键 |
out_trade_no | 订单编号 |
state | 状态 |
create_time | 订单生成时间 |
total_amout | 订单总金额 |
pay_amout | 实际支付价格 |
pay_type | 支付类型 |
nickname | 昵称 |
head_img | 头像 |
user_id | 用户id |
del | 是否删除 |
update_time | 更新时间 |
order_type | 订单类型 |
recerver_address | 收货地址 |
product_order_item
表字段名字 | 解释 |
---|---|
id | 自增主键 |
order_out_no | 订单编号 |
product_order_id | 订单id |
product_id | 商品id |
buy_num | 购买数量 |
product_img | 商品图片 |
create_time | 创建时间 |
total_amount | 总价 |
amount | 单价 |
技术分析
- rabbitMQ
当延迟队列,消息先投入(普通交换机,普通交换机绑定私信交换机),消费时从(死信队列也是普通交换机)里面消费,监听死信队列 - nacos
注册服务,网关转发 - redission
redis的分布式锁,解决redis原子性锁不能自动续期的问题 - redis
图片验证码
redis中key 是 captchar:md5(user-agent+ip) 32 ,value 是captcharContext
只有通过图片验证码才会发送邮箱验证码,邮箱验证码也是用redis存储
redis中key是 code:%s:%s,第一个%s是用来SendCode_Enum ,第二个%s是发送的to邮箱 ,value 是 code_currentTime, code是随机生成验证码,currentTime是当前生成时间
60秒内不重新发送,防止盗刷
整个结构在redis中使用RedisTemplate<String,String>存储
购物车用redis存储
购物车的键值,redis中key是 cart:%s %s是用户的唯一标识,一般使用userId
整个结构是redisTemplate<Sting,Hash>, Hash中的第一个是ProductId,第二个就是CartItemVO
方法有 add delete confirmCart changeNum showCart deleteitem
- task表
恢复锁定的数据