# mall **Repository Path**: anton97/mall ## Basic Information - **Project Name**: mall - **Description**: 商城项目:分布式微服务项目,对Spring Cloud/Alibaba 等所学技术的综合运用场景练习...... - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 1 - **Created**: 2022-01-13 - **Last Updated**: 2025-02-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mall ## 技术选型 - 熟悉 SpringBoot 以及常见整合方案 - 了解 SpringCloud - 熟悉 git maven - 熟悉 linux、redis docker 基本操作 - 了解 html,css,js,vue - 熟练使用 idea 开发项目 ```text SpringCloud Alibaba - Nacos : 注册中心 (服务发现/注册) SpringCloud Alibaba- Nacos: 配置中心 (动态配置管理) SpringCloud - Ribbon: 负载均衡 SpringCloud - Feign: 声明式HTTP客户端(调用远程服务) SpringCloud Alibaba - Sentinel: 服务容错(限流、降级、熔断) SpringCloud - Gateway: API 网关 (webflux 编程模式) SpringCloud - Sleuth:调用链监控 SpringCloud Alibaba - Seata: 原Fescar, 即分布式事务解决方案 ``` ## 业务术语 - SPU 标准产品单元 - SKU 最小销售单元 - SPU 代表一类商品,它的 商品介绍 和 规格与包装 相同 - 同一分类 SPU 所对应的属性分组和属性名相同,只是属性的值不同 - 真正决定商品价格的叫做销售属性,也就是 SKU ## 项目进度 ### 一、环境搭建 - 搭建项目环境,初始化配置git仓库 - 安装Linux虚拟机环境(docker) - 开发环境统一配置 - 逆向工程 - MyBatis-Plus整合 - SpringCloud Alibaba ```text 导入依赖 配置数据源(mysql) 在application.yml配置数据源相关信息(逻辑删除) 启动类添加@MapperScan("xxx.xxx.xxx.dao")映射 配置类分页配置 统一返回结果集 R ``` ### 二、Object划分 1、PO (persistant object) 持久化对象 po 就是对应数据库中某一个表的一条记录,多个记录可以用 PO 的集合,PO 中应该不包含任何对数据库到操作 2、DO ( Domain Object) 领域对象 就是从现实世界抽象出来的有形或无形的业务实体 3、TO (Transfer Object) 数据传输对象 不同的应用程序之间传输的对象 4、DTO (Data Transfer Object) 数据传输对象 这个概念来源于 J2EE 的设计模式,原来的目的是为了 EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分数调用的性能和降低网络负载,但在这里,泛指用于展示层与服务层之间的数据传输对象 5、VO(value object) 值对象 通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已,但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要,用 new 关键字创建,由 GC 回收 view Object 试图对象 接受页面传递来的数据,封装对象,封装页面需要用的数据 6、BO(business object) 业务对象 从业务模型的角度看,见 UML 原件领域模型中的领域对象,封装业务逻辑的, java 对象,通过调用 DAO 方法,结合 PO VO,进行业务操作,business object 业务对象,主要作用是把业务逻辑封装成一个对象,这个对象包括一个或多个对象,比如一个简历,有教育经历,工作经历,社会关系等等,我们可以把教育经历对应一个 PO 、工作经验对应一个 PO、 社会关系对应一个 PO, 建立一个对应简历的的 BO 对象处理简历,每 个 BO 包含这些 PO ,这样处理业务逻辑时,我们就可以针对 BO 去处理 7、POJO ( plain ordinary java object) 简单无规则 java 对象 传统意义的 java 对象,就是说一些 Object/Relation Mapping 工具中,能够做到维护数据库表记录的 persisent object 完全是一个符合 Java Bean 规范的 纯 java 对象,没有增加别的属性和方法,我们的理解就是最基本的 Java bean 只有属性字段 setter 和 getter 方法 POJO 时是 DO/DTO/BO/VO 的统称 8、DAO(data access object) 数据访问对象 是一个 sun 的一个标准 j2ee 设计模式,这个模式有个接口就是 DAO ,他负持久层的操作,为业务层提供接口,此对象用于访问数据库,通常和 PO 结合使用,DAO 中包含了各种数据库的操作方法,通过它的方法,结合 PO 对数据库进行相关操作,夹在业务逻辑与数据库资源中间,配合VO 提供数据库的 CRUD 功能 ### 三、 后台管理系统实现 #### 1. 商品系统/分类维护/三级分类 ```text 一级分类查出二级分类数据,二级分类中查询出三级分类数据,获取所有分类以及子分类,并返回json树形结构 CategoryController: product/category/list/tree 数据库设计:category表 cat_id(分类id) parent_cid(父分类id) cat_level(分类级数) 一级id的父id为0,二级分类的父id为一级分类id,三级分类父id为二级分类id 问题:jackSon中@JsonInclude注解:返回前端的实体类中如果某个字段为空的话那么就不返回这个字段了 ``` ```text 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域 解决: 1.使用nginx部署为同一域 2.配置当次请求允许跨域:请求先发送到网关,网关在转发给其他服务,事先都要注册到注册中心 ``` #### 2. 删除选中的一个或者多个分类 ```text 在appliction.yml 中配置 myabtisplus 逻辑删除,@TableLogic(value = "1", delval = "0") CategoryController: product/category/delete @RequestBody:获取请求体,必须发送post请求才有 get请求没有 ``` #### 3.新增品牌(JSR303 数据效验, 统一异常处理) ```text BrandController: product/brand/save 给Bean添加校验注解,并添加提示信息,开启效验功能 @Valid,给效验的bean后紧跟一个BindingResult 就可以获取到效验的结果 处理异常:编写异常处理类使用SpringMvc的@ControllerAdvice,使用@ExceptionHandler标记方法可以处理异常 ``` #### 4. 获取属性分类分组 ```text AttrGroupController: product/attrgroup/list/{catelogId} 根基分页参数,关键字和id查询分组信息 ``` #### 5. 修改属性分组信息回显 ```text AttrGroupController: product/attrgroup/info/{attrGroupId} 根据传来的属性分组id获取分组信息 根据分组信息中的分类id,查询分类id查询拼装所在路径保存到数组中 ``` #### 6. 点击新建关联,获取当前分组没有关联的属性 ```text AttrGroupController: product/attrgroup/{attrgroupId}/noattr/relation ``` #### 7. 完善规格参数和销售属性 #### 8. 发布商品 ```text 选择要发布商品的分类,根据分类查出对应的品牌 ``` #### 9. 商品上架 ```text 1、根据业务,分析上架商品所需发送给es的数据,创建出to - SkuEsModel 2、点击上架,携带spuId发送up请求,准备SkuEsModel所需数据 3、查出当前spuId对应的所有sku信息,pms_sku_info表,得到商品相关属性 4、查询可以用来检索的规格属性: 根据 spuid 查询 pms_product_attr_value表,拿到所有的 attrId 根据 attrId 查询 pms_attr 查询检索的属性,search_type=1为检索属性 5、发送远程调用,库存系统查询是否有库存 6、其他基本信息 7、组装数据,发给es进行保存 8、远程调用成功,修改状态 ``` #### 10.登录 ```text 社交登录 账号登录 用户注册 登录 ``` #### 11.购物车 ```text 购物车信息将存到Redis中,存储结构为Hash结构: key: cart:用户号 value:{[key:skuId,value:物品信息],[key,value],[key,value]...} 根据分析,创建 CartVo, CartItemVo 因为购物车分为登录状态的 用户购物车 和 未登录的 游客购物车,考虑写一个拦截器,在执行目标方法之前判断用户登录状态,设置临时用户ID ``` #### 12.订单 ```text 任何订单相关操作都需要登录,定义 LoginUserInterceptor 拦截器 1.登录状态下,点击购物车,跳转到订单确认页:查出收货人信息、选择支付方式、列出订单中所有商品、优惠信息、支付价格 2.点击提交订单,创建订单,跳转支付页 3.整合alipay沙箱环境支付、内网穿透 ``` #### 13.秒杀 ```text 后台管理添加秒杀场次,关联秒杀商品(哪个商品、秒杀价格、总数量、每人几个) 定时任务闲时上架秒杀商品 上架幂等性处理 秒杀业务完成(拦截器登录校验--合法性校验--幂等性保证--信号量扣减--发消息给MQ--直接返回订单号) ```