文章目录
- 1 long类型精度丢失问题
- 1.1 解决
- 1.2 导入jackson序列化工具
- 1.3 自定义注解
- 1.4 原理
- 1.5 测试
- 2 用户行为要求
- 3 创建微服务behavior
- 3.1 微服务创建
- 3.2 添加启动类
- 3.3 创建bootstrap.yml
- 3.4 在nacos中配置redis
- 3.5 引入redis依赖
- 3.6 更新minio
- 4 跳过
1 long类型精度丢失问题
在数据库与网络传输的long类型的id传输中,long类型的id发生了精度丢失
1.1 解决
- 当后端响应给前端的数据中包含了id或者特殊标识(可自定义)的时候,把当前数据进行转换为String类型
- 当前端传递后后端的dto中有id或者特殊标识(可自定义)的时候,把当前数据转为Integer或Long类型。
特殊标识类说明:
IdEncrypt 自定义注解 作用在需要转换类型的字段属性上,用于非id的属性上 在model包下
1.2 导入jackson序列化工具
将jackson序列化工具导入heima-leadnews-common模块下的com.heima.common.jackson
因为是外来复制进来的,要想让spring进行管理,就需要将配置类导入src/main/resources/META-INF/spring.factories中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.heima.common.exception.ExceptionCatch,\com.heima.common.aliyun.GreenTextScan,\com.heima.common.aliyun.GreenImageScan,\com.heima.common.tess4j.Tess4jClient,\com.heima.common.redis.CacheService,\com.heima.common.jackson.InitJacksonConfig
1.3 自定义注解
将配置导入spring后,发现有个注解找不到
需要导入自定义注解
导入自定义注解到heima-leadnews-model模块中的com.heima.model.common.annotation.IdEncrypt
@JacksonAnnotation
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
public @interface IdEncrypt {
}
1.4 原理
在heima-leadnews-common模块下的com.heima.common.jackson.ConfusionSerializerModifier类中
public class ConfusionSerializerModifier extends BeanSerializerModifier {@Overridepublic List<BeanPropertyWriter> changeProperties(SerializationConfig config,BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {List<BeanPropertyWriter> newWriter = new ArrayList<>();for(BeanPropertyWriter writer : beanProperties){String name = writer.getType().getTypeName();if(null == writer.getAnnotation(IdEncrypt.class) && !writer.getName().equalsIgnoreCase("id")){newWriter.add(writer);} else {writer.assignSerializer(new ConfusionSerializer());newWriter.add(writer);}}return newWriter;}
}
if(null == writer.getAnnotation(IdEncrypt.class) && !writer.getName().equalsIgnoreCase("id"))
如果是被IdEncrypt注解标注的或者为id字段的则被自动转为字符串序列化。
1.5 测试
重启heima-leadnews-artcile微服务
id已经加上双引号,转为字符串也就不会有精度丢失了。
2 用户行为要求
- 所有的行为数据,都存储到redis中
- 点赞、阅读、不喜欢需要专门创建一个微服务来处理数据,新建模块:heima-leadnews-behavior
- 关注需要在heima-leadnews-user微服务中实现
- 收藏与文章详情数据回显在heima-leadnews-article微服务中实现
3 创建微服务behavior
3.1 微服务创建
创建微服务heima-leadnews-behavior
3.2 添加启动类
@SpringBootApplication
public class BehaviorAppliction {public static void main(String[] args) {SpringApplication.run(BehaviorAppliction.class, args);}
}
3.3 创建bootstrap.yml
创建bootstrap.yml配置nacos
server:port: 51806
spring:application:name: leadnews-behaviorcloud:nacos:discovery:server-addr: 192.168.204.129:8848config:server-addr: 192.168.204.129:8848file-extension: yml
3.4 在nacos中配置redis
在nacos中创建leadnews-behavior配置中心,配置redis
因为文章相应的点赞收藏需要操作数据库,所以也需要配置数据库信息。
spring:redis:host: 192.168.204.129password: leadnewsport: 6379datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/leadnews_admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falseusername: rootpassword: 123sjbsjb
3.5 引入redis依赖
为heima-leadnews-behavior模块引入redis依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis依赖commons-pool 这个依赖一定要添加 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
因为在之间已经将redis的工具类CacheService放入heima-leadnews-common的com.heima.common.redis下,并且交由spring管理,所以其他微服务可以直接注入CacheService使用redis。
3.6 更新minio
因为要进行回显,所以需要对静态html的文件在每次更新后进行重新生成静态文件。
在heima-leadnews-article模块中的com.heima.article.test中编写一个ArticleFreemarkerTest测试类,用于重新加载所有文件的minio的静态地址
@SpringBootTest(classes= ArticleApplication.class)
@RunWith(SpringRunner.class)
public class ArticleFreemarkerTest {@Autowiredprivate ApArticleContentMapper apArticleContentMapper;@Autowiredprivate Configuration configuration;@Autowiredprivate FileStorageService fileStorageService;@Autowiredprivate ApArticleService apArticleService;@Testpublic void testAllFreemarker() throws Exception {//1.获取所有文章idApArticle apArticle = new ApArticle();List<ApArticle> apArticles = apArticleService.list();for (ApArticle article : apArticles) {//2.获取文章内容ApArticleContent apArticleContent = apArticleContentMapper.selectOne(Wrappers.<ApArticleContent>lambdaQuery().eq(ApArticleContent::getArticleId, article.getId()));if(apArticleContent!=null&& StringUtils.isNotBlank(apArticleContent.getContent())){//3.文章内容通过freemarker生成静态html页面Template template = configuration.getTemplate("article.ftl");//3.1 创建模型Map<String,Object> content=new HashMap();content.put("content", JSONArray.parseArray(apArticleContent.getContent()));//3.2 输出流StringWriter writer = new StringWriter();//3.3 合成方法template.process(content,writer);//4.把静态页面上传到minio//4.1 文件流InputStream inputStream = new ByteArrayInputStream(writer.toString().getBytes());String path = fileStorageService.uploadHtmlFile("",apArticleContent.getArticleId()+".html",inputStream);//5.把静态页面的路径保存到数据库apArticleService.update(Wrappers.<ApArticle>lambdaUpdate().eq(ApArticle::getId,apArticleContent.getArticleId()).set(ApArticle::getStaticUrl,path));}}}
}
4 跳过
黑马头条的前端有问题,点点赞和不喜欢还有关注没反应的,查看前端请求url也没有捕捉到,收藏和评论按钮也没有,估计前端写的有问题,没有前端源码,懒得研究。day9直接跳过。