# gulimall **Repository Path**: HanQiCheng/gulimall ## Basic Information - **Project Name**: gulimall - **Description**: 谷粒商城 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-17 - **Last Updated**: 2022-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gulimall #### 介绍 #### 软件架构 软件架构说明 项目基础版本: Spring Boot: 2.1.8. RELEASE Spring Cloud: Greenwich.SR3 Spring Cloud Alibaba: 2.1.0. RELEASE 分布式组件选择: Spring Cloud Alibaba-Nacos,: 注册中心 Spring Cloud Alibaba-Nacos: 配置中心 Spring Cloud Alibaba-Seata: 分布式事务 Spring Cloud Alibaba-Sentinel: 服务容错(限流、降级、熔断) Spring Cloud-Ribbon: 负载均衡 Spring Cloud-Gateway: API网关 Spring Cloud-Sleuth: 调用链监控 Spring Cloud-Open Feign: 调用远程服务 模块说明: 公共模块: 负责装载重复使用的依赖以及工具类 第三方服务模块: 负责提供短信验证码,对象存储 认证服务模块: 负责接收用户登陆注册请求 购物车服务模块: 负责添加商品到购物车等功能 网关服务模块: 负责路由转发,限流 会员服务模块: 负责处理认证服务的登陆注册请求 订单服务模块: 负责下单相关请求 商品服务模块: 负责前后台商品相关请求 检索服务模块: 负责利用Elasticsearch上架/检索商品 负责说明: 会员服务: 流程 用户从商城主页或需要登陆才能使用的功能入口进入登陆/注册页面,有账号则直接登陆,没有则注册再登陆 注册: 用户填写基本信息,并且通过填写的手机号向后台认证服务发起获得验证码的请求,认证服务生成随机验证码存入Redis(会携带当前的时间戳,用户下次再请求验证码会先判断2次请求间隔是否大于60秒),再拿着手机号跟验证码请求第三方短信服务给用户发送验证码,用户获得验证码,表单数据通过前端的验证,向后台认证服务发起注册请求,后台使用JSR303对前台发送过来的表单数据进行校验(接着校验验证 码),通过校验则拿着表单数据调用远程会员服务实现注册,会员服务拿到表单数据后检验用户名和手机在数据库中是否唯一,唯一则设置保存用户信息完成注册(密码使用BCryptPasswordEncoder加密保存) 登陆: 普通登陆: 用户在前台输入账号密码,向认证服务发起登陆请求,认证服务校验数据,调用远程会员服务发起登陆请求,会员服务根据用户名在数据库中查找是否有该用户,查到该用户则将用户表单密码跟数据库中的加密密码进行解密对比,对比成功则登陆成功,将用户信息保存在Spring Session域中返回 社交登陆: 用户选择使用社交账号登陆,将跳转到第三方社交网站进行登陆授权,授权成功第三方社交平台返回授权码,我们拿着授权码再去第三方平台获得访问令牌,通过访问令牌来得到用户id,头像,名称等基础信息,通过用户id判断该用户是否第一次登陆,是则利用用户基础信息注册用户,不是则直接将用户信息保存到Spring Session域中返回 单点登陆: 创建一个登陆服务器,所有登陆请求都会被转发到这个服务器,用户登陆成功会在本机客户端留下一个token唯一令牌,根据token去session查询用户 购物车服务: 购物车结构: 购物车属于读写都高并发的服务,所以考虑使用Redis保存购物项,为便于操作,则使用Hash保存每个用户的购物车,具体结构为双层Map: Map>第一层Key作为每个用户的id,第二层Key作为商品id,购物车分为2个Vo,购物项Vo保存添加的商品信息(id,选中状态,数量,图片,标题,单价,总价,销售属性),购物车Vo内包含若干购物项以及商品总数量,商品种类数,总价(总价都会自动计算) 购物车流程: 用户访问任何购物车服务操作都会先使用拦截器从session中获取用户数据判断用户是否登陆,登陆则将对应的用户id设置到登陆状态Vo属性中,没登陆且没有临时用户则使用cookie为用户创建一个临时用户,将临时用户id也保存到Vo另一个属性中 购物车功能: 加入购物车: 用户点击商品详情页的加入购物车功能将携带该商品项的id与数量向购物车服务发起请求,购物车服务根据用户登陆状态判断使用临时购物车还是永久购物车,添加到购物车前判断购物车中是否已经有该商品,有则更改商品数量,没有则异步访问远程服务查出商品详情保存到购物项Vo中,再将购物项保存到对应的购物车,最后重定向返回添加的商品信息给成功提示页展示 访问/合并购物车: 用户访问购物车将通过用户登陆状态从Redis中获取对应的临时/永久购物车详情,如果用户已登陆,除了返回永久购物车数据,还要查询该用户临时购物车中是否有商品,有则直接调用加入购物车方法将临时购物车中的商品合并到永久购物车一起返回,没有登陆则直接返回临时购物车数据,最后将Redis购物车数据保存到购物车Vo中返回给页面 改变商品选中状态/数量: 获取更改后的值,对Redis中对应的数据进行更改 删除购物车/购物项: 获取购物车(用户id)/购物项id,根据id查询对应的购物车/购物项删除 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. 运行git clone https://gitee.com/QC_GET/gulimall.git 2. 在mysql数据库中依次创建6个数据库:gulimall_admin ,gulimall_oms ,gulimall_pms,gulimall_sms,gulimall_ums,gulimall_wms,并将gulimall-common模块资源文件mysql里的sql数据插入,并在配置文件中根据TODO提示修改数据库配置 3. 安装redis,并在配置文件中根据TODO提示修改redis配置 4. 安装es和kibana以及ik分词器,根据gulimall-common资源目录中es目录文件添加一个映射关系,并根据对应的TODO修改es配置 5. 根据gulimall-common模块的资源目录中的nginx修改其配置文件 6. 下载Nacos注册配置中心并运行startup.cmd 7. 在sentinel控制台目录打开cmd,使用:java -jar sentinel-dashboard-1.7.1.jar --service.post=8333 命令运行sentinel控制台 9. 在hosts文件中添加 192.168.137.1 gulimall.com 192.168.137.1 search.gulimall.com 192.168.137.1 item.gulimall.com 192.168.137.1 auth.gulimall.com 192.168.137.1 cart.gulimall.com 192.168.137.1 order.gulimall.com 192.168.137.1 member.gulimall.com 192.168.137.1 seckill.gulimall.com ,地址为nginx的安装地址,这里是本机地址 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)