开头老规矩,手动推荐一波了,欢迎大家关注我的公众号“风云编程录”,感谢大家🙏。
0. 前序--侧边栏自定义模块的添加
今天,我看到其他博客侧边栏是可以添加自己的微信公众号。我其实也有自己的微信公众号“风云编程录”,当然希望在自己的博客上可以推广一下。但是大家都理解,毕竟属于不同的流量入口,CSDN肯定是不会那么容易让你通过它将流量引向其他平台的。所以我研究了一下,具体怎样才能在自己的博客侧栏添加这些自定义内容(懂得都懂,如果不按照CSDN要求的路子走,你擅自添加这些内容,它就会在你提交文章的时候审核不通过)。
研究了一半天,发现早期是比较容易添加的,但是对于我们这种已经走入到21世纪2022年的新青年来说,就没有那么多的便利了。只有三种方式才能做到达成这种效果。具体如下:
(1)“钞能力” ,充值CSDN的VIP会员
(2)“专家头衔”,达到CSDN制定的一系列标准,成为CSDN认证的专家团队的一员
(3)“企业户口”,对于在CSDN注册的企业账户,上传自己的企业证明,也可以达成该成就。
分析了上面的三种方式,对于我这个“白嫖屌丝”来说,还是放弃不合理的幻想,写在正文之前,让大家一乐。
好了,书归正文。有一段时间没有更新我们的商城项目了。主要是上个周是由我负责项目上线,需要准备的东西特别多。而且每次上线我都惴惴不安,心思都在这上面了。万幸上线没有问题,这个周我们继续更新我们的商城项目的后续步骤。
1. 整合mybatisplus
1.1 在gulimall-common模块中,导入如下依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
1.2 配置
1.2.1 配置数据源
1.2.1.1 导入mysql驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
1.2.1.2 解决gulimall-common模块中的错误依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope> //目标环境已经存在,不需要打到包里面
</dependency>
其中,pom文件依赖中有一个小知识点,对于scope属性配置为provided的类型,代表该jar包不需要打包到部署包中,该jar包由具体的运行环境提供。
1.2.1.3 application.yml中配置数据源相关信息
在gulimall-product模块中添加配置文件application.yml,配置内容如下:
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.56.100:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.jdbc.Driver
1.2.2 配置mybatis-plus
1.2.2.1 在启动类上使用@MapperScan注解标记我们生成的dao类的位置
@SpringBootApplication
@MapperScan("com.whq.gulimall.product.dao")
public class GulimallProductApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallProductApplication.class, args);
}
}
1.2.2.2 配置Mybatis-plus的sql映射文件位置,配置位置为application.yml
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
1.2.2.3 配置主键自增,配置位置为application.yml(已携带上一步的配置)
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
1.3 测试
配置完成后,我们使用测试类测试一下。这里发现renren-generator生成的代码中有一处错误。运行项目的时候实体类中报错。
原因是数据库中采用的是Longblob 类型, java中应该使用byte[] 去定义变量。
修改如下:
1.3.1 测试数据保存以及主键自增
@SpringBootTest
class GulimallProductApplicationTests {
@Autowired
BrandService brandService;
@Test
void contextLoads() {
BrandEntity brandEntity = new BrandEntity();
brandEntity.setName("华为");
brandService.save(brandEntity);
System.out.println("保存成功。。。。。");
}
}
测试结果如下:
1.3.2 测试更新
依托上一个用例中添加的huawei记录,我们进行更新,测试用例如下:
@SpringBootTest
class GulimallProductApplicationTests {
@Autowired
BrandService brandService;
@Test
void contextLoads() {
BrandEntity brandEntity = new BrandEntity();
// brandEntity.setName("华为");
// brandService.save(brandEntity);
// System.out.println("保存成功。。。。。");
brandEntity.setBrandId(31L);
brandEntity.setDescript("华为品牌");
brandService.updateById(brandEntity);
System.out.println("更新成功。。。。");
}
}
1.3.3 查询用例
@SpringBootTest
class GulimallProductApplicationTests {
@Autowired
BrandService brandService;
@Test
void contextLoads() {
BrandEntity brandEntity = new BrandEntity();
// brandEntity.setName("华为");
// brandService.save(brandEntity);
// System.out.println("保存成功。。。。。");
// brandEntity.setBrandId(31L);
// brandEntity.setDescript("华为品牌");
// brandService.updateById(brandEntity);
// System.out.println("更新成功。。。。");
List<BrandEntity> list = brandService.list(new QueryWrapper<BrandEntity>().isNotNull("logo"));
list.forEach((item)->{
System.out.println(item);
});
}
}
2. 其他四个模块的初步成型
通过代码生成工具,我们生成一下其他模块的代码,具体过程如下:
(1) 将代码生成器renren-generator的 application.yml的配置修改修改为对应模块的数据库(此处都以member模块为例):
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
#MySQL配置
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.56.100:3306/gulimall_ums?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
(2)将代码生成器renren-generator的generator.properties修改如下:
mainPath=com.whq
package=com.whq.gulimall
moduleName=member
author=cloudwindback
email=giteeforwhq@163.com
tablePrefix=ums_
(3) 修改完成后,重启一下renren-generator模块
(4) 将生成的代码替换掉member模块中main目录中的代码
(5) member模块中添加gulimall-common的组建依赖
<dependency>
<groupId>com.whq.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
(6) member模块添加application.yml 文件,增加配置数据源、mapper文件所在位置以及d自增
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.56.100:3306/gulimall_ums?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
(7) 将entity中 UndoLogEntity 的Longblob属性修改为byte[]属性
(8) 启动后验证
随便找一个controller中的实现进行验证
3. 高可用配置(端口区域预分配)
由于我们多个模块没有区分端口号,默认启动都会以8080端口进行启动,这样同时启动会因为端口冲突导致启动失败,我们约定如下分配:
模块 | 端口范围 |
coupon | 7000~7999 |
member | 8000~8999 |
order | 9000~9999 |
product | 1000~10999 |
ware | 11000~11999 |
这样,每一个模块分配一个端口号段,避免后期保证高可用每个模块都需要启用多个微服务实例的情况。
至此,我们的项目已经有了五个比较完整的模块了,我们已经走出了一段不短的距离了。