黑马头条学习笔记
Day01-环境搭建
项目概述
课程大纲
业务说明
技术栈
-
Spring-Cloud-Gateway : 微服务之前架设的网关服务,实现服务注册中的API请求路由,以及控制流速控制和熔断处理都是常用的架构手段,而这些功能Gateway天然支持
-
运用Spring Boot快速开发框架,构建项目工程;并结合Spring Cloud全家桶技术,实现后端个人中心、自媒体、管理中心等微服务。
-
运用Spring Cloud Alibaba Nacos作为项目中的注册中心和配置中心
-
运用mybatis-plus作为持久层提升开发效率
-
运用Kafka完成内部系统消息通知;与客户端系统消息通知;以及实时数据计算
-
运用Redis缓存技术,实现热数据的计算,提升系统性能指标
-
使用Mysql存储用户数据,以保证上层数据查询的高性能
-
使用Mongo存储用户热数据,以保证用户热数据高扩展和高性能指标
-
使用FastDFS作为静态资源存储器,在其上实现热静态资源缓存、淘汰等功能
-
运用Hbase技术,存储系统中的冷数据,保证系统数据的可靠性
-
运用ES搜索技术,对冷数据、文章数据建立索引,以保证冷数据、文章查询性能
-
运用AI技术,来完成系统自动化功能,以提升效率及节省成本。比如实名认证自动化
-
PMD&P3C : 静态代码扫描工具,在项目中扫描项目代码,检查异常点、优化点、代码规范等,为开发团队提供规范统一,提升项目代码质量
虚拟机环境搭建
用户名:root
密码:itcast
静态ip地址:192.168.200.130
mysql查看端口
netstat -aon|findstr "3306"
工程主体结构
登录->使用盐来配合验证
redis会报错先注释掉
接口工具
postman、swagger、knife4j
我用的是Apifox
swagger常用注解:
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数的描述信息
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
ApUserLoginController
@RestController
@RequestMapping("/api/v1/login")
@Api(value = "app端用户登录", tags = "ap_user", description = "app端用户登录API")
public class ApUserLoginController {@Autowiredprivate ApUserService apUserService;@PostMapping("/login_auth")@ApiOperation("用户登录")public ResponseResult login(@RequestBody LoginDto dto){return apUserService.login(dto);}
}
LoginDto
@Data
public class LoginDto {/*** 手机号*/@ApiModelProperty(value="手机号",required = true)private String phone;/*** 密码*/@ApiModelProperty(value="密码",required = true)private String password;
}
网关
思路分析:
-
用户进入网关开始登陆,网关过滤器进行判断,如果是登录,则路由到后台管理微服务进行登录
-
用户登录成功,后台管理微服务签发JWT TOKEN信息返回给用户
-
用户再次进入网关开始访问,网关过滤器接收用户携带的TOKEN
-
网关过滤器解析TOKEN ,判断是否有权限,如果有,则放行,如果没有则返回未认证错误
前端集成
作用:
-
通过nginx的反向代理功能访问后台的网关资源
-
通过nginx的静态服务器功能访问前端静态页面
Day02
文章列表加载
三张表
app端文章列表
表的拆分-垂直拆分
垂直拆分:将一个表的字段分散到多个表中,每个表存储其中一部分字段。
优势:
- 减少IO争抢,减少锁表的几率:查看文章概述与文章详情互不影响。
- 充分发挥高频数据的操作效率:对文章概述数据操作的高效率不会被操作文章详情数据的低效率所拖累。
拆分规则:
- 把不常用的字段单独放在一张表。
- 把text,blob等大字段拆分出来单独放在一张表。
- 经常组合查询的字段单独放在一张表中。
会遇到什么类路径找不到的 把target文件夹全部删掉,再次运行
freemarker
FreeMarker 是一款 模板引擎
基础语法
1.注释<#-- -->
2.插值${..}
3.FTL指令<# >FTL指令</#>
4.文本信息<#--freemarker中的普通文本-->
集合指令
<#list stus as stu><tr><td>${stu_index+1}</td><td>${stu.name}</td><td>${stu.age}</td><td>${stu.money}</td></tr>
</#list>
if指令
<#if ></if>
运算符
<b>算数运算符</b>
<br/><br/>100+5 运算: ${100 + 5 }<br/>100 - 5 * 5运算:${100 - 5 * 5}<br/>5 / 2运算:${5 / 2}<br/>12 % 10运算:${12 % 10}<br/>
<hr>
比较运算符
-
=
或者==
:判断两个值是否相等. -
!=
:判断两个值是否不等. -
>
或者gt
:判断左边值是否大于右边值 -
>=
或者gte
:判断左边值是否大于等于右边值 -
<
或者lt
:判断左边值是否小于右边值 -
<=
或者lte
:判断左边值是否小于等于右边值
空值处理
1、判断某变量是否存在使用 “??”
2、缺失变量默认值使用 “!”
内建函数
语法:变量+?+函数名称
具体参考MD文档
对象存储服务MinIO
MinIO简介
对象存储的方式对比
存储方式 | 优点 | 缺点 |
---|---|---|
服务器磁盘 | 开发便捷,成本低 | 扩展困难 |
分布式文件系统(MinIO) | 容易实现扩容 | 复杂度高 |
第三方存储 | 开发简单,功能强大,免维护 | 收费 |
文章详情
closing inbound before receiving peer‘s close_notify的解决办法-CSDN博客
MP查询
Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone())//1.获取文章内容
apArticleContentMapper.selectOne(Wrappers<ApArticleContent>lambdaQuery().eq(ApArticleContent::getArticleId, 1302862387124125698L));