不算是学习的第一个开源项目,但是是第一个运行起来的开源项目。作者的说明文档真的写的太棒了,手把手教学。
在自己准备定位系统项目的过程中碰壁好多,突发奇想,现在的水平自己造轮子很烂,老师给的项目也比较老旧,没有参考价值,没有进展,转换思维,不如先找个开源的优秀项目学习一下。
(这篇文章是去年存货了,最近整理一下都存在博客里,在这个项目中真的学到了很多,在学习mall之前还是个启动开源项目都会出好多bug的小白,现在进步了一点点)
启动记录
前端:
Error: sass-loader requires node-sass >=4. Please install a compatible version.
输入下面代码,参考博客
npm install sass-loader node-sass -D
后端的架构和技术选型文档,有教程文档太贴心了。
首先当然是,
git clone 地址.git
,连接不上github直接采用了下载zip,效果是一样的。准备环境。
- Redis—-下载地址 v3.2.100
- Elasticsearch–下载地址 v7.6.2 搜索功能优化
- Kibana–下载 v7.6.2 作为访问Elastisearch的客户端
- Logstash–下载 v7.6.2 用于收集日志
建立数据库—下载地址
启动redis
进入安装位置,输入
redis-server.exe redis.windows.conf
启动后端程序,启动前端界面
登录出错
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表达式—面向函数编程
MyBatisGenerator
MyBatis的代码生成器,可以根据数据库生成model、mapper.xml、mapper接口和Example,通常情况下的单表查询不用再手写mapper。
Swagger-UI实现在线API文档
Security+JWT 认证和授权
mall-tiny-04
- 报错:
javax.xml.bind.DatatypeConverter
同样是jdk版本太高了,参考了博客 - 莫名其妙的swagger接口测试失败,所以删除了项目重新解压载入,解决上述报错后测试成功。估计上次错误也是这个原因,但是不提示报错信息,就束手无策了。
- 知道了,这时候的解决方法是打断点,进入debug。
1 | 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风格来操作数据存储的方式。
添加依赖修改配置文件。
新建商品文档对象:EsProduct,接口EsProductDao实现与数据库交互,导入数据到ES文档
不需要中文分词的字段设置成@Field(type = FieldType.Keyword)类型,需要中文分词的设置成@Field(analyzer = “ik_max_word”,type = FieldType.Text)类型。
EsProductRepository extends ElasticsearchRepository:这样就拥有了一些基本的 Elasticsearch 数据操作方法,同时定义了一个衍生查询方法。
EsProductService-EsProductServiceImpl:
1 | public interface EsProductService { |
- EsProductController:聚合EsProductService,调用Service方法完成搜索。映射搜索请求路径。
创建索引,获取索引,jsoup解析网页
简单查询
- 在 SpringBoot 中,使用 Elasticsearch Repositories 的衍生物查询来实现;查询结果的原理原理就是将规则方法名称的方法名称转换为 E 的查询 DSL 语句
复杂查询
Mongodb实现文档操作
使用场景: 各种应用服务的日志存储,敏捷开发,地理位置信息存储,json存储。
示例添加会员浏览记录
非关系型数据库,和elasticsearch的操作非常像,都是Spring Data类型的数据操作
- 添加依赖,修改配置
- 建立文档
- 继承MongoRepository,这样就有了一些基本的操作Mongodb数据操作方法。
两者都可使用衍生查询
在接口中直接指定查询方法名称便可查询,无需进行实现
安装过程中的踩坑:
按照教程步骤进行但是连接失败。
安装路径中不要包含空格, NO Program Files!留下血泪。保姆级教程
仍然有问题,删除data目录下的文件又重新建了文件夹。参考博客
管理员身份运行,问题解决
mongod --config "E:\Programs\MongoDB\Server\3.2\mongod.cfg" --install --serviceName "MongoDB"
net start MongoDB
Redis
可用于数据缓存,主要用于处理大量数据的高访问负载。
整合redis的过程以短信验证码为例。
- application.yml添加redis的配置,添加自定义key的设置
- 添加RedisService接口用于定义常用Redis操作。
- 实现RedisService接口(注入StringRedisTemplate(继承自RedisTemplate))
- 添加根据电话号码获取验证码接口 Controller
- 添加需要的功能服务接口和实现类
StringBuilder
教学示例中获取动态验证码通过StringBuilder来产生。
摘自官方文档
StringBuilder ,它是一个可变字符串类。 可变性是指在创建类的实例后,可以通过追加、移除、替换或插入字符来修改它。StringBuilder对象维护缓冲区以容纳对字符串的扩展。
使用场景:
- 如果希望代码在设计时对字符串进行未知数量的更改 (例如,当你使用循环来连接包含用户输入) 的随机数量的字符串时。
- 希望代码对字符串进行大量更改时。
RabbitMQ 实现延迟消息
安装:
Erlang下载,记得安装完成配置环境变量,安装教程
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系列在我看来目前用不到,跟着作者的学习用例浅浅试用了一下,自己搭建的单体小项目用不到,接触不到公司项目就只能浅浅了解一下。
挖坑,分布式调研。