Compare commits

...

2 Commits

Author SHA1 Message Date
Y1NanPing c282d5ff1f 第二次课程提交 2025-07-19 08:35:26 +08:00
Y1NanPing dac4d3653f 第二次课程提交 2025-07-19 08:34:59 +08:00
21 changed files with 237 additions and 5 deletions

View File

@ -43,5 +43,10 @@
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.14.4</version>
</dependency>
</dependencies>
</project>

View File

@ -1,18 +1,22 @@
package com.atguigu.tingshu.common.util;
import com.alibaba.ttl.TransmittableThreadLocal;
/**
* 获取当前用户信息帮助类
*/
public class AuthContextHolder {
private static ThreadLocal<Long> userId = new ThreadLocal<Long>();
private static ThreadLocal<Long> userId = new TransmittableThreadLocal<Long>();
public static void setUserId(Long _userId) {
userId.set(_userId);
}
public static Long getUserId() {
return userId.get();
//return userId.get();
//TODO 暂时硬编码为1后续做完登录验证后再修改
return 1L;
}
public static void removeUserId() {

View File

@ -1,8 +1,15 @@
package com.atguigu.tingshu.album.api;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -16,5 +23,19 @@ public class AlbumInfoApiController {
private AlbumInfoService albumInfoService;
@Operation(summary = "新建专辑信息")
@PostMapping("/albumInfo/saveAlbumInfo")
public Result saveAlbumInfo(@Validated @RequestBody AlbumInfoVo albumInfoVo) {
Long userId = AuthContextHolder.getUserId();
albumInfoService.saveAlbumInfo(albumInfoVo, userId);
return Result.ok();
}
}

View File

@ -1,14 +1,31 @@
package com.atguigu.tingshu.album.api;
import com.atguigu.tingshu.album.service.FileUploadService;
import com.atguigu.tingshu.common.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Tag(name = "上传管理接口")
@RestController
@RequestMapping("api/album")
public class FileUploadApiController {
@Autowired
private FileUploadService fileUploadService;
@Operation(summary = "上传文件")
@PostMapping("/fileUpload")
public Result<String> fileUpload(@RequestParam("file") MultipartFile file) throws IOException {
String url = fileUploadService.fileUpload(file);
return Result.ok(url);
}
}

View File

@ -1,7 +1,9 @@
package com.atguigu.tingshu.album.config;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ -13,4 +15,13 @@ public class MinioConstantProperties {
private String accessKey;
private String secreKey;
private String bucketName;
@Bean
public MinioClient minioClient() {
return
MinioClient.builder()
.endpoint(endpointUrl)
.credentials(accessKey, secreKey)
.build();
}
}

View File

@ -0,0 +1,9 @@
package com.atguigu.tingshu.album.service;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.stereotype.Service;
public interface AlbumAttributeValueService extends IService<AlbumAttributeValue> {
}

View File

@ -1,9 +1,14 @@
package com.atguigu.tingshu.album.service;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.baomidou.mybatisplus.extension.service.IService;
public interface AlbumInfoService extends IService<AlbumInfo> {
//新建专辑信息
void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId);
//保存专辑的状态
void saveAlbumInfoStat(Long albumId, String statType, int statNum);
}

View File

@ -0,0 +1,11 @@
package com.atguigu.tingshu.album.service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
public interface FileUploadService {
String fileUpload(MultipartFile file) throws IOException;
}

View File

@ -0,0 +1,11 @@
package com.atguigu.tingshu.album.service.impl;
import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.service.AlbumAttributeValueService;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class AlbumAttributeValueServiceImpl extends ServiceImpl<AlbumAttributeValueMapper, AlbumAttributeValue> implements AlbumAttributeValueService {
}

View File

@ -1,18 +1,88 @@
package com.atguigu.tingshu.album.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumAttributeValueService;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {
@Autowired
private AlbumInfoMapper albumInfoMapper;
@Autowired
private AlbumAttributeValueService albumAttributeValueService;
@Autowired
private AlbumStatMapper albumStatMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
//1.保存专辑信息
//1.1 将专辑VO视图对象对象转为专辑PO持久化对象对象
//将我们上传专辑的那个表中的数据转换成为albumInfo这个持久化对象数据里
//相当于把传上来的表变成一个你存大数据的表 albumInfo这表中有大量的数据 比如说专辑的状态 属性等
//不是这一个albumInfoVo表能装下的
//用这个工具要保证两个字段是相同的
AlbumInfo albumInfo= BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
//1.2 封装PO对象中用户ID免费试听集数专辑状态
//这两张表只有这三个状态是不一样的
albumInfo.setUserId(userId);
albumInfo.setTracksForFree(5);
albumInfo.setStatus(SystemConstant.ALBUM_STATUS_NO_PASS);
//1.3 保存专辑得到专辑ID
albumInfoMapper.insert(albumInfo);
Long albumId = albumInfo.getId();
//2.保存专辑标签信息
List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
if (CollUtil.isNotEmpty(albumAttributeValueVoList)) {
//2.1 将集合泛型从AlbumAttributeValueVo转为AlbumAttributeValue
//最一开始是vo类型 你通过stream将泛型
List<AlbumAttributeValue> attributeValueList = albumAttributeValueVoList
.stream()
.map(vo -> {
AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(vo, AlbumAttributeValue.class);
//2.2 为每个专辑标签关系 关联 专辑ID
albumAttributeValue.setAlbumId(albumId);
return albumAttributeValue;
}).collect(Collectors.toList());
//2.3 批量保存
albumAttributeValueService.saveBatch(attributeValueList);
}
this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_PLAY, 0);
this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE, 0);
this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_BUY, 0);
this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_COMMENT, 0);
}
@Override
public void saveAlbumInfoStat(Long albumId, String statType, int statNum) {
AlbumStat albumStat = new AlbumStat();
albumStat.setAlbumId(albumId);
albumStat.setStatType(statType);
albumStat.setStatNum(statNum);
albumStatMapper.insert(albumStat);
}
}

View File

@ -0,0 +1,68 @@
package com.atguigu.tingshu.album.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import com.atguigu.tingshu.album.config.MinioConstantProperties;
import com.atguigu.tingshu.album.service.FileUploadService;
import com.atguigu.tingshu.common.execption.GuiguException;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.UUID;
@Slf4j
@Service
public class FileUploadServiceImpl implements FileUploadService {
@Autowired
private MinioClient minioClient;
@Autowired
private MinioConstantProperties minioConstantProperties;
@Override
public String fileUpload(MultipartFile file) throws IOException {
//1.业务校验 检验图片是否合法
BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
if (bufferedImage == null){
throw new GuiguException(500,"上传文件类型错误");
}
//2.检查图片上传的大小是否合理
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
if(width>900||height>900){
throw new GuiguException(500,"上传图片过大");
}
//3.将图片文件上传MINIO 规范日期/文件唯一命名.后缀
//3.1 生成日期作为文件夹名称
String folderName = DateUtil.today();
//3.2 生成文件唯一名称
String extName = FileUtil.extName(file.getOriginalFilename());
String objectName = "/" + folderName + "/" + UUID.randomUUID().toString() + "." + extName;
//3.上传文件
try {
minioClient.putObject(
PutObjectArgs.builder().bucket(minioConstantProperties.getBucketName()).object(objectName).stream(
file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build());
} catch (Exception e) {
log.error("上传文件到MINIO失败{}", e.getMessage());
throw new GuiguException(500, "上传文件到MINIO失败");
}
//4.拼接MINIO文件在线地址
return minioConstantProperties.getEndpointUrl() + "/" + minioConstantProperties.getBucketName() + objectName;
}
}