Fork me on GitHub

mall学习记录

不算是学习的第一个开源项目,但是是第一个运行起来的开源项目。作者的说明文档真的写的太棒了,手把手教学。

在自己准备定位系统项目的过程中碰壁好多,突发奇想,现在的水平自己造轮子很烂,老师给的项目也比较老旧,没有参考价值,没有进展,转换思维,不如先找个开源的优秀项目学习一下。

(这篇文章是去年存货了,最近整理一下都存在博客里,在这个项目中真的学到了很多,在学习mall之前还是个启动开源项目都会出好多bug的小白,现在进步了一点点)

启动记录

首先github地址贴上 前端 后端

前端:

  • Error: sass-loader requires node-sass >=4. Please install a compatible version.

    输入下面代码,参考博客

    npm install sass-loader node-sass -D

后端的架构和技术选型文档,有教程文档太贴心了。

  1. 首先当然是,git clone 地址.git,连接不上github直接采用了下载zip,效果是一样的。

  2. 准备环境。

    1. Redis—-下载地址 v3.2.100
    2. Elasticsearch–下载地址 v7.6.2 搜索功能优化
    3. Kibana–下载 v7.6.2 作为访问Elastisearch的客户端
    4. Logstash–下载 v7.6.2 用于收集日志
  3. 建立数据库—下载地址

    • 查看数据库存储的位置
    • 导入数据库脚本,要先创建mall数据库
    • 数据库表前缀说明
      • cms_*:内容管理模块相关表
      • oms_*:订单管理模块相关表
      • pms_*:商品模块相关表
      • sms_*:营销模块相关表
      • ums_*:会员模块相关表
  4. 启动redis

    进入安装位置,输入 redis-server.exe redis.windows.conf

  5. 启动后端程序,启动前端界面

  6. 登录出错

    • java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter 原因是jdk版本过高,可以手动导入或者降低jdk版本 参考了博客

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      <!--    导入4个jar包,解决jdk9缺失jar包引起的报错-->
      <!-- java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter-->

      <dependencies>
      <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0</version>
      </dependency>
      <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-impl</artifactId>
      <version>2.3.0</version>
      </dependency>
      <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-core</artifactId>
      <version>2.3.0</version>
      </dependency>
      <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
      </dependency>
      </dependencies>

啊,至此admin启动成功,感动哭。

基础技术补充

配套mall学习代码git地址

搭建基本骨架

Lombok

Lombok表达式—面向函数编程

参考1 2

MyBatisGenerator

MyBatis的代码生成器,可以根据数据库生成model、mapper.xml、mapper接口和Example,通常情况下的单表查询不用再手写mapper。

Swagger-UI实现在线API文档

Security+JWT 认证和授权

mall-tiny-04

  • 报错:javax.xml.bind.DatatypeConverter 同样是jdk版本太高了,参考了博客
  • 莫名其妙的swagger接口测试失败,所以删除了项目重新解压载入,解决上述报错后测试成功。估计上次错误也是这个原因,但是不提示报错信息,就束手无策了。
  • 知道了,这时候的解决方法是打断点,进入debug。
1
2
	String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword());
============>

Elasticsearch实现商品搜索

报错:

  • None of the configured nodes are available: 通常是clustername设置有问题,但在本项目中是因为版本不匹配,下载了v7.6.2,yml的配置已经修改。

Spring Data Elasticsearch,一种以Spring Data风格来操作数据存储的方式。

  1. 添加依赖修改配置文件。

  2. 新建商品文档对象:EsProduct,接口EsProductDao实现与数据库交互,导入数据到ES文档

    不需要中文分词的字段设置成@Field(type = FieldType.Keyword)类型,需要中文分词的设置成@Field(analyzer = “ik_max_word”,type = FieldType.Text)类型。

  3. EsProductRepository extends ElasticsearchRepository:这样就拥有了一些基本的 Elasticsearch 数据操作方法,同时定义了一个衍生查询方法。

  4. EsProductService-EsProductServiceImpl:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public interface EsProductService {
/**
* 从数据库中导入所有商品到ES
*/
int importAll();

/**
* 根据id删除商品
*/
void delete(Long id);

/**
* 根据id创建商品
*/
EsProduct create(Long id);

/**
* 批量删除商品
*/
void delete(List<Long> ids);

/**
* 根据关键字搜索名称或者副标题
*/
Page<EsProduct> search(String keyword, Integer pageNum, Integer pageSize);

}
  1. EsProductController:聚合EsProductService,调用Service方法完成搜索。映射搜索请求路径。

创建索引,获取索引,jsoup解析网页

简单查询

  • 在 SpringBoot 中,使用 Elasticsearch Repositories 的衍生物查询来实现;查询结果的原理原理就是将规则方法名称的方法名称转换为 E 的查询 DSL 语句

复杂查询

Mongodb实现文档操作

使用场景: 各种应用服务的日志存储,敏捷开发,地理位置信息存储,json存储。

示例添加会员浏览记录

非关系型数据库,和elasticsearch的操作非常像,都是Spring Data类型的数据操作

  1. 添加依赖,修改配置
  2. 建立文档
  3. 继承MongoRepository,这样就有了一些基本的操作Mongodb数据操作方法。
  • 两者都可使用衍生查询

    在接口中直接指定查询方法名称便可查询,无需进行实现

安装过程中的踩坑:

按照教程步骤进行但是连接失败。

  1. 安装路径中不要包含空格, NO Program Files!留下血泪。保姆级教程

    mongod..cfg重要配置详解

  2. 仍然有问题,删除data目录下的文件又重新建了文件夹。参考博客

  3. 管理员身份运行,问题解决

    mongod --config "E:\Programs\MongoDB\Server\3.2\mongod.cfg" --install --serviceName "MongoDB"

    net start MongoDB

Redis

tiny-03

可用于数据缓存,主要用于处理大量数据的高访问负载。

整合redis的过程以短信验证码为例。

  1. application.yml添加redis的配置,添加自定义key的设置
  2. 添加RedisService接口用于定义常用Redis操作。
  3. 实现RedisService接口(注入StringRedisTemplate(继承自RedisTemplate))
  4. 添加根据电话号码获取验证码接口 Controller
  5. 添加需要的功能服务接口和实现类

StringBuilder

教学示例中获取动态验证码通过StringBuilder来产生。

摘自官方文档

StringBuilder ,它是一个可变字符串类。 可变性是指在创建类的实例后,可以通过追加、移除、替换或插入字符来修改它。StringBuilder对象维护缓冲区以容纳对字符串的扩展。

使用场景

  • 如果希望代码在设计时对字符串进行未知数量的更改 (例如,当你使用循环来连接包含用户输入) 的随机数量的字符串时。
  • 希望代码对字符串进行大量更改时。

RabbitMQ 实现延迟消息

安装:

Erlang下载,记得安装完成配置环境变量,安装教程

Rabbitmq下载路径

http://localhost:15672/

OSS 实现文件上传

业务熟悉:数据库设计

整个看了一遍。还是挺复杂的。

商品模块:主页面的商品分类,商品品牌(店铺),商品属性选择(属性和描述参数);编辑商品(商品基本信息,促销信息,属性信息,关联),库存表,打折表(满减方式,打折方式,会员积分抵扣方式),商品评价和回复,商品操作记录;

订单模块:不同状态下的订单,订单表,订单商品表(一个订单包含不同的商品),订单操作记录表;从下单到选地址,计算优惠,到形成订单预览,选择支付方式,订单处理,售后服务(订单退货,退货原因管理,退货地址管理)。

营销模块:限时购主题设置,限时购商品选择(秒杀活动);优惠券表;首页品牌推荐表,新品推荐,人气推荐,首页专题推荐,首页轮播广告。

源码解析

mall-common, mall-mbg, mall-security都是被调用的模块。

mall-portable调用了mall-mbg和mall-security.

权限控制

角色管理

本项目的角色分为商品管理员,订单管理员,超级管理员,普通用户。

角色——资源和菜单的分配,资源指的是对接口的访问。

  • 返回树形结构的数据,stream流可以很好解决嵌套问题。

目录权限,菜单权限,按钮权限

关于权限控制的内容写了一个总结,可以跳转,SpringSecurity-JWT

商品模块

参考我们使用某宝的习惯,打开软件是首页推荐,可以分类分级选择商品分类,点击查看店铺详情,选择商品打开商品详情页,显示商品基本信息,促销信息,属性信息,关联推荐,已买用户评价。

该模块实现了部分上述功能,商品分类属性,商品库存,店铺管理。

可扩展的,还可以增加提问与回答模块,店铺自己的联想推荐,新增评价(评价管理),。

在自己写代码的过程中总结的写业务流程大概是,先了解业务相关的名词,然后理清逻辑设计数据库,写出伪代码/流程图,最后实践写代码

参考这一流程浅析一下作者的实现。

这一模块中最复杂的service应该是PmsProductService,也是最核心的服务之一,每次下单的操作都是对商品的操作。如何计算商品优惠后的价格,下单后对库存进行操作在mall-portal中实现。

订单模块

订单模块包括下单到选地址,计算优惠,到形成订单预览,选择支付方式,订单处理,售后服务。

OmsOrderService订单管理启用了Spring事务,在上一个模块中也有新建和删除操作采用了事务管理,批量发货,批量关闭订单,修改订单收货人信息,修改订单费用信息,修改订单备注这几个方法都加了@Transactional的注解,每个操作中注意更新订单操作历史。

OmsOrderSettingService可以设置订单超时时间。

已经实现的功能偏向于店铺管理人员操作,批量处理订单,处理退货申请,查看订单详情。

可选的,新增订单,提交退货申请,用户的商品浏览历史,从使用者的角度增加业务功能。

营销模块

首页专题推荐,首页新/商品推荐,首页品牌推荐,首页广告。促销活动场次添加,商品添加。优惠券管理。

这里的推荐算法是简单的使用了数据库字段的推荐值排序。要涉及实际情况的推荐算法又是一个大坑了。

有时间写一个推荐算法调研。

可扩展的,秒杀模块,直播模块,消息模块。

以上几个模块都是在后台管理服务mall-admin模块下的,所以没有软件使用者角度的方法,接下来mall-portal模块,实现了客户端的请求处理。

收藏,关注,浏览历史,购物车管理,退货管理,前台订单管理,促销管理(计算购物车价格)。

收藏关注浏览历史都用MongoDB来存储。

MongoRepository

进阶篇-微服务项目

Spring Cloud系列在我看来目前用不到,跟着作者的学习用例浅浅试用了一下,自己搭建的单体小项目用不到,接触不到公司项目就只能浅浅了解一下。

挖坑,分布式调研。



本文标题:mall学习记录

文章作者:tsuki

发布时间:2022.03.25 - 19:42

最后更新:2022.04.26 - 16:00

原始链接:https://tsuki419.github.io/mall开源项目记录.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------THE END-------------
0%