Spring Boot 博客
Com.公司名.项目名
创建工程
- 找到启动类
- 相当于项目的入口
- 项目创完右边有个maven
1. 环境搭建
基础知识
- < parent>标签 : 父类,继承自哪一类
- 阿里云和官方的 Server URL
- 把项目构建在哪
- <artifactId>标签
- 实际对应项目的名称,就是项目根目录的名称。
报错
- 版本号报错
- 没有自动导包
各种包
是Spring MVC的分层
Config
配置
MyBatisPlusConfig
拦截器,用来分页
拦住的是数据库那边的数据
请求(WebService) — 服务器 — 数据库(MyBatisPlus的拦截器)
WebMVCConfig
Controller
- 控制器
- 也是接口,但和interface不一样
- 暴露给前端的接口
dao
mapper
- 接口,和数据库操作的接口
- 有泛型,操作的就是泛型的类型
- BaseMapper
- 继承该接口后,
- 无需编写 mapper.xml 文件,
- 即可获得CRUD功能
- 多表查询等的就是要写SQL语句了
pojo
实体类,有时也用entity
service
- 业务包
- 调用对应的接口
- 比如登录
- 调用dao
impl
vo
参数
返回值
- 统一结果封装
- 不管是什么类型,都封装成Result
- 标准
- service
- 接口
- 还有个实现类包 Impl
- 接口
添加的各个依赖的介绍
再添加两个标签
- dependencyManagement
- 方便管理
- packaging
- 声明为父工程
以上是父工程,再建立子工程
- 再把依赖导进去
对子工程配置
- 在子工程 src - main - Resourcs - new file
- applica.properties
applica.properties
可以删掉的部分
- 不需要写版本的部分
- 父类已经有了
数据库驱动报红
- Maven
- Reload一下
加上MyBatis Plus的配置
- 表名的前缀
新建启动类
- @SpringBootApplication注解
MyBatisPlus的实现类MyBatisPlusConfig
注解
分页插件
- 拦截器
WebMvcConfig实现接口WebMvcConfigurer
- 加入CorsMappings
- 跨域配置
- 前端8080和后端8888,端口不一样
- 有个跨域配置,要允许8080访问
总结,先建立父工程再建各个模块
2. 第一个功能:文章列表
pojo
Mapper
- 每个实体类新建一个接口
- 继承自BaseMapper<>
controller
- 需要用到
- 参数
- 返回值
- 都建立新的类
vo包
为什么都要拿到别的地方
- 相当于和页面交互的数据
- 不和数据库完全一致
params包
- 全是参数
返回值类
service
service接口
ArticleServiceImpl
- 不能和数据库完全一致
- 要和页面向交互的vo包
- 讲将Article转为ArticleVo
处理数据库数据
- copy
- 处理单个
- copyList
- 全部处理掉
- 有些不能Copy的,
- set方法
ArticleServiceImpl
建立Resource下的目录,要和Mapper一致
建立Tagmapper.xml
- 标签内写什么
- 使用快捷键创建SQL语句
- 没有自动提示
- 关联数据库
3. 最热标签
前端工程
后端工程
Controller
- TagsController
TagService
TagServiceImpl
查询1
SQL 语句
- 别名的作用
实现
使用插件生成SQL语句
- 加上
- 参数类型
- 自己写的SQL
查询2
为什么需要第二个SQL语句
SQL语句的特殊写法
- 别名
- for循环?
Mapper
- 没有内容
- 内容在XML中
配置Swagger文档
添加依赖
yml文件
逻辑过程
controller -> service -> mapper
3. 统一异常处理
有可能有意料之中的异常,意料之外的异常
新建一个包handler
新建一个类
加个注解
- 一个拦截器
- AOP的实现
4. 首页,
最热文章
最新文章
- controller
- service
- serviceImpl
- 写SQL语句
文章归档
- 按照时间,显示某时间发了多少文章的:档案
在dao下,新建dos包
- 也是数据库查询来的,但不需要持久化的数据
SQL 语句处理
- 在Impl把所有前台的内容处理完。
- 转入SQL
就是转入Mapper进行
- 还没有文件
- 建立Mapper
- 关联Mapper接口
- namespace
Mapper的SQL语句如何写
- Mapper里面写SQL语句对应的标签
- id要对应方法
- resultType返回值类型对应好类
- 里面写SQL语句
5. 登录 准备
接口介绍
- 返回的是个token
jwt
- 可以理解为一个加密的算法
token
- 令牌
组成
本身就是个JSON
三部分:A.B.C
A部分
header部分
内容相对固定
容易被解密,无所谓
B部分
自定义信息,可以存东西
不能存放敏感信息,可以被解密
C部分
A+B+密钥组成
JWT验证
主要验证的是C部分
使用
- 添加依赖
- 子类的pom文件
- 建立util包
- 工具类
- copy工具类进取
6. 登录功能
整合Redis
介绍
https://blog.csdn.net/lydms/article/details/105224210
yml文件,如何配置Redis
https://www.cnblogs.com/rainbow70626/p/15785754.html
7. 获取用户信息
8. 退出登录
- 接口说明
- 还是使用token来确定退出的是哪个账户
9. 注册
大步骤一
- 把controller类写好之后
- 方法中想的是,把交给哪个Service处理
- 需要用到某个功能,想到他的service
大步骤二
- 把Service写好
- Impl
- 加上事务
- redis也要启动才能成功
10. 登录拦截器
- 可不可以统一进行登录判断
- 防止一旦登录的逻辑有变
Spring MVC里的知识点——登录拦截器
- 需要登录才能访问的接口,如果未登录就直接拦截
代码实现
- handler包
11. ThreadLocal保存用户信息
- 希望在Controller中直接获取用户信息如何获取
Util包下创建
ThreadLocal介绍
- 做线程变量隔离
- ThreadLocal是空间换时间,Synchronized是时间换空间???
ThreadLocal内存泄露
- 线程会持有一个Map
强引用和弱引用
强引用
- 不会被GC回收,
- 内存空间不足宁愿抛出异常
- 如果想取消,就赋值为null
弱引用
- 有空间也会被干掉
ThreadLocal内存泄露
- Map中key是弱引用,会被干掉
- value还在?永远都在
12. 文章详情
ServiceImpl中如何写
- 步骤分析
- 需要哪些vo
- 或者实体类
- 从数据库把这些类赋值
数据库如何赋值
- Mapper对象,打点,调用
Mapper如何写
- 创建出类
- @Repository注解
- 去xml中对应
13. 文章详情:阅读量
多线程
- 阅读量功能
- 需要更新时是加写锁
- 会阻塞线程
修正bug
- 发现更新的SQL语句和预期不一样
- 解决
- 把int改为Integer
- 一定要用封装的类型
- 不能使用基本类型
13. 文章详情:评论列表
Controller
- 所有的方法返回的类型都是Result
- 但是真正函数的返回是一个Service
- Result对象在Service中生成
Autowired
- 在Controller中注入Service
- Impl类中注入Mapper
- Impl类中注入别的Service
Impl实现类
- 逻辑
.var可以做什么
LambdaQueryWrapper类
- 查询条件
- .eq()方法
BeanUtils类
14. 评论功能
- 要加入到登录拦截器
bug
- 这里要修改SQL表的结构
- 后端数据太长了,前端会丢失一些位数
- 导致精度丢失
- 序列化,把Long id
- 转成String
- 就不会精度丢失
15. 写文章
- 有MarkDown的功能
文章分类
文章所有标签
写文章
- 拦截器拦截了才能用UserThreadLocal?
16. AOP日志
开发注解
- 创建注解
- 开发AOP
17. 图片上传功能
- 参数的注解
@RequestParam - 上传随机的文件名称
- 图片服务器
1.
七牛云
初步
- 密码:Mklose11.
- 对象存储kodo
- 新建空间
域名
- 绑定了自己的
使用
- 文档
- 开发者中心
- 对象存储
- SDK下载
- JAVA SDK
- Maven
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.7.0, 7.7.99]</version>
</dependency>
工具类
- 下拉,翻阅到代码介绍
- 字节数组上传
- 代码有变化
- accessKey
- secretKey
- 在:个人中心 - 密钥管理
- 七牛云配置
https://blog.csdn.net/weixin_52025712/article/details/116932311?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=1
工具类的使用
- Configuration选对地区
- accessKey/accessSecretKey/bucket
- url
- 使用他给的
- 格式要写对
- http:// ***** /
18. 后面的功能
SQL语句
- and 条件
逻辑
自定义SQL语句
- 创建XML文件
- 在xml中写好id 和 namespace
- 使用 resultMap标签 来映射
- where标签
优化
1. 统一缓存处理
- 内存访问速度更大
- 统一做缓存处理
- 使用aop
使用AOP注解
- 定义一个切点
- 加在哪哪就是切点
- 加注解
结果
- 在一定时间内
- 拦住所有密集访问
- 使其走缓存
2. 精度损失
- 加上缓存之后出现精度损失,按照Long处理了
- Long 改为 String
3.
- 文章可以放入es中
- 评论功能优化,可以加入表情等
- mongodb
- 阅读数,评论数。增加的放入Redis
- 定时把数据固化到数据库
- 目前情况下还是加了锁,并发量大时麻烦
- 为了加快访问速度,部署的时候,可以把图片,js,css等放入七牛云存储中,加快网站访问速度
前端
1. 层次结构
- 配置文件
- 环境
- 生产环境
- 图片
- 对应数据库
- 源码
- 后端访问的接口
2. 找对应的代码
3. 配置前后端交互
config
- dev.env.js
- 环境
- prod.env
- 生产环境
- api
- 后端访问接口
4. 运行
Chmod -R 777 文件位置
npm run dev
- 改文章标题
- index.html
- router - index.js
- component
- BaseFooter.vue
- 所有文字都在 components