diff --git a/README.md b/README.md
index 6ad1c3e..cdf8f9a 100644
--- a/README.md
+++ b/README.md
@@ -4936,43 +4936,9 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 测试实战
+### 自定义注解+AOP实战文件分享设计实战
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### 第十六章 自定义注解+AOP实战文件分享设计实战
-
-
-
-#### 第1集 【业务难点】查看他人分享文件列表业务设计
-
-**简介: 【业务难点】查看他人分享文件列表业务设计**
+#### 【业务难点】查看他人分享文件列表业务设计
* 需求
@@ -4980,8 +4946,6 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 选择部分或者全部分享的文件,或者进入对应的文件夹,转存到自己网盘
-
-
* 思考难点
* 上述业务逻辑如何实现?
@@ -5009,23 +4973,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第2集 AI智能化云盘-基本分享信息接口开发实战
-
-**简介: AI智能化云盘-基本分享信息接口开发实战**
+#### AI智能化云盘-基本分享信息接口开发实战
* 需求
* 用户访问分享链接,进入对应的分享文件页面
@@ -5048,7 +4996,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 业务逻辑开发
- ```
+ ```java
@Override
public ShareSimpleDTO simpleDetail(Long shareId) {
@@ -5074,7 +5022,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 令牌生成
- ```
+ ```java
/**
* 创建分享的令牌
*/
@@ -5126,23 +5074,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第3集 AI智能化云盘-分享链接校验码接口开发
-
-**简介: AI智能化云盘-分享链接校验码提口开发**
+#### AI智能化云盘-分享链接校验码接口开发
* 需求
@@ -5160,7 +5092,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 编码实战
- ```
+ ```java
public String checkShareCode(ShareCheckReq req) {
ShareDO shareDO = shareMapper.selectOne(new QueryWrapper().eq("id", req.getShareId())
@@ -5186,27 +5118,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第4集 AI智能化云盘-查看分享详情接口开发
-
-**简介: AI智能化云盘-查看分享详情接口开发**
+#### AI智能化云盘-查看分享详情接口开发
* 需求
@@ -5218,8 +5130,6 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 如何校验访问token和分享ID的关联性
* 哪些接口需要校验token,如何实现复用?
-
-
* 业务逻辑
* 查询分享记录实体
@@ -5230,7 +5140,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 编码实战
- ```
+ ```java
public ShareDetailDTO detail(Long shareId) {
//1、查询分享记录实体,检查分享状态
ShareDO shareDO = checkShareStatus(shareId);
@@ -5249,19 +5159,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
}
```
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第5集 自定义注解+AOP实现文件分享token校验实战《上》
+#### 自定义注解+AOP实现文件分享token校验实战《上》
**简介: 自定义注解+AOP实现文件分享token校验实战**
@@ -5309,7 +5207,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 自定义注解`ShareCodeCheck`编码实战
- ```
+ ```java
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@@ -5319,7 +5217,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 定义切面类
- ```
+ ```java
@Aspect
@Component
@Slf4j
@@ -5351,27 +5249,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
}
```
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第6集 自定义注解+AOP实现文件分享token校验实战《下》
-
-**简介: 自定义注解+AOP实现文件分享token校验实战**
+#### 自定义注解+AOP实现文件分享token校验实战《下》
* 需求
@@ -5380,7 +5258,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 编码实战
- ```
+ ```java
/**
* 定义 @Pointcut注解表达式,
* 方式一:@annotation:当执行的方法上拥有指定的注解时生效(我们采用这)
@@ -5425,7 +5303,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 查看分享详情接口配置注解
- ```
+ ```java
@GetMapping("detail")
@ShareCodeCheck
public JsonData detail(){
@@ -5436,24 +5314,9 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
+### 网盘分享文件转存+全链路测试实战
-
-
-
-
-
-
-
- **愿景:"IT路上的持续充电平台,让技术不再难学"**
-**更多高级课程请访问 xdclass.net**
-
-### 第十七章 网盘分享文件转存+全链路测试实战
-
-
-
-#### 第1集 查看某个分享文件夹下的文件列表接口实战
-
-**简介: 查看某个分享文件夹下的文件列表接口实战**
+#### 查看某个分享文件夹下的文件列表接口实战
* 需求
* 开发查看某个分享链接的子文件列表接口
@@ -5471,7 +5334,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 接口开发+自定义注解
- ```
+ ```java
@PostMapping("list_share_file")
@ShareCodeCheck
public JsonData listShareFile(@RequestBody ShareFileQueryReq req){
@@ -5485,7 +5348,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 业务逻辑
- ```
+ ```java
public List listShareFile(ShareFileQueryReq req) {
//1、检查分享链接状态
ShareDO shareDO = checkShareStatus(req.getShareId());
@@ -5509,23 +5372,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第2集 网盘分享文件转存接口设计和开发实战
+#### 网盘分享文件转存接口设计和开发实战
**简介: 网盘分享文件转存接口设计和开发实战**
@@ -5551,7 +5398,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 修改校验逻辑
- ```
+ ```java
private ShareDO checkShareStatus(Long shareId) {
ShareDO shareDO = shareMapper.selectById(shareId);
if (shareDO == null) {
@@ -5574,7 +5421,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 处理转存逻辑
- ```
+ ```java
public void transferShareFile(ShareFileTransferReq req) {
// 1、分享链接是否状态准确
@@ -5613,17 +5460,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-#### 第3集 网盘分享文件+转存全链路接口测试实战
+#### 网盘分享文件+转存全链路接口测试实战
**简介: 网盘分享转存全链路接口测试实战**
@@ -5637,9 +5474,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* Bug修复
- ```
- //计算存储空间大小,检查是否足够
- if(!fileService.checkAndUpdateCapacity(req.getAccountId(),batchTransferFileList.stream()
+ ```java
+ //计算存储空间大小,检查是否足够 if(!fileService.checkAndUpdateCapacity(req.getAccountId(),batchTransferFileList.stream()
.map(accountFileDO -> accountFileDO.getFileSize() == null ? 0 : accountFileDO.getFileSize())
.mapToLong(Long::valueOf).sum())){
throw new BizException(BizCodeEnum.FILE_STORAGE_NOT_ENOUGH);
@@ -5656,32 +5492,9 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 账号B登录(登录token记得替换, 增加share-token), 转存a1目录到自己的根目录
* 账号B登录(登录token记得替换),查看自己根目录下的文件夹,还有a1目录下的子文件内容
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- **愿景:"IT路上的持续充电平台,让技术不再难学"**
-**更多高级课程请访问 xdclass.net**
-
-### 第十八章 AI网盘回收站设计和编码开发实战
-
+### AI网盘回收站设计和编码开发实战
-
-#### 第1集 网盘回收站需求背景和业务逻辑讲解
-
-**简介: 网盘回收站需求背景和业务逻辑讲解**
+#### 网盘回收站需求背景和业务逻辑讲解
* 业务需求
@@ -5709,23 +5522,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第2集 当前用户的个人回收站文件列表开发实战
-
-**简介: 当前用户的个人回收站文件列表开发实战**
+#### 当前用户的个人回收站文件列表开发实战
* 需求
@@ -5742,7 +5539,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 编码实战
- ```
+ ```java
@Override
public List listRecycleFiles(Long accountId) {
@@ -5763,19 +5560,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-#### 第3集 AI网盘彻底删除回收站文件设计和开发实战
-
-**简介: AI网盘彻底删除回收站文件设计和开发实战**
+#### AI网盘彻底删除回收站文件设计和开发实战
* 需求背景
* 回收站文件用于临时存储删除的文件
@@ -5793,7 +5578,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 编码实战
- ```
+ ```java
public void delete(FileDelReq fileDelReq) {
//文件ID数量是否合法
// 要删除的文件Ids
@@ -5822,25 +5607,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第4集 回收站查看和彻底删除回收站接口测试
-
-**简介: 回收站查看和彻底删除回收站接口测试**
+#### 回收站查看和彻底删除回收站接口测试
* 需求
* 测试查看我的回收站列表
@@ -5848,35 +5615,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 测试实战
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第5集 网盘回收站还原文件或者文件夹设计
-
-**简介: 网盘回收站还原文件或者文件夹设计**
+#### 网盘回收站还原文件或者文件夹设计
* 需求
@@ -5884,8 +5623,6 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
- 支持批量恢复操作,提高用户操作效率
- 业务逻辑有哪些注意事项考虑?
-
-
* 业务逻辑
* 检查是否满足:文件ID数量是否合法
@@ -5896,7 +5633,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 编码实战
- ```
+ ```java
@Transactional(rollbackFor = Exception.class)
public void restoreFile(FileRecycleReq req) {
@@ -5938,23 +5675,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第6集 网盘回收站还原文件接口测试实战
-
-**简介: 网盘回收站还原文件接口测试实战**
+#### 网盘回收站还原文件接口测试实战
* 需求
@@ -5963,27 +5684,9 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 测试实战
-
-
-
-
-
-
-
-
+### AI网盘文件搜索和下载功能开发实战
-
-
- **愿景:"IT路上的持续充电平台,让技术不再难学"**
-**更多高级课程请访问 xdclass.net**
-
-### 第十九章 AI网盘文件搜索和下载功能开发实战
-
-
-
-#### 第1集 网盘搜索功能需求介绍和接口设计说明
-
-**简介: 网盘搜索功能需求介绍和接口设计说明**
+#### 网盘搜索功能需求介绍和接口设计说明
* 需求
@@ -5997,7 +5700,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 编码实战
- ```
+ ```java
@Override
public List searchList(Long accountId, String search) {
List accountFileDOList = accountFileMapper.selectList(new QueryWrapper()
@@ -6012,21 +5715,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第2集 网盘下载功能需求介绍和多方案思考选择
-
-**简介: 网盘下载功能需求介绍和多方案思考选择**
+#### 网盘下载功能需求介绍和多方案思考选择
* 需求
@@ -6095,23 +5784,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 依赖于**HTTP协议中的`Range`请求头**,当浏览器发起下载请求时,可以通过`Range`头指定从文件的某个字节开始下载
* 用户存在多个浏览器,版本问题、厂商问题等 导致不支持,因此web端不做这个功能
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第3集 网盘多文件下载功能设计和开发实战
-
-**简介: 网盘多文件下载功能设计和开发实战**
+#### 网盘多文件下载功能设计和开发实战
* 需求
* 开发文件下载功能,前端请求后端,后端请求文件存储获取下载地址
@@ -6122,7 +5795,7 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
* 编码实战(可以支持单个或者多个文件下载)
- ```
+ ```java
@Override
public List getDownloadUrl(FileDownloadReq req) {
//获得要下载的用户文件对象
@@ -6154,23 +5827,8 @@ public JsonData list(@RequestParam(value = "parent_id")Long parentId){
}
```
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#### 第4集 网盘下载功能相关链路测试实战和规划
-**简介: 网盘下载功能相关链路测试实战和规划**
+#### 网盘下载功能相关链路测试实战和规划
* 需求
* 测试AI云网盘文件下载功能