2024年最新基于微服务的云相册项目,【一篇文章搞懂

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

import com.cloud.photo.common.common.CommonEnum;
import com.cloud.photo.common.common.ResultBody;
import com.cloud.photo.common.constant.CommonConstant;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.regex.Pattern;

@Service
public class LoginServiceImpl implements LoginService {

@Resource
private UserFeignService userFeignService;


@Override
//获得用户信息,先从缓存获取,没有则创建缓存
public ResultBody getUserInfo() {
    if (StpUtil.isLogin()) {
        //用户登录ID
        String loginId = StpUtil.getLoginIdAsString();
        //如果session里面有信息优先从里面拿
        SaSession session = StpUtil.getSessionByLoginId(loginId);
        if (session != null) {
            String userInfo = session.getModel(CommonConstant.USER_INFO, String.class);
            if (userInfo != null) {
                return ResultBody.success(JSON.parseObject(userInfo, UserBo.class));
            }
        }
        //否则访问user服务获取用户信息
        ResultBody userInfo = userFeignService.getUserInfo(loginId);
        if (userInfo.getCode().equals(CommonEnum.SUCCESS.getResultCode())){
            //成功拿到用户信息就存缓存里面,true是有的话就存,没有的话就新建
            SaSession saSession = StpUtil.getSessionByLoginId(loginId, true);
            saSession.set(CommonConstant.USER_INFO, JSON.toJSONString(userInfo.getData()));
        }
        return userInfo;
    }
    //未登录
    return ResultBody.error(CommonEnum.NO_LOGIN);
}

}



### (4)图片上传


此部分未项目重点,请做好笔记!!以下我将介绍整个图片上传流程


**使用步骤**


在父工程导入依赖,部分依赖上面已经导入,这里仅展示未导入的



    <!--        kafka-->
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>

    <!--        hutool工具-->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>4.1.1</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.51</version>
    </dependency>

    <!--        上传图片需要用到-->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-core</artifactId>
        <version>1.12.487</version>
    </dependency>

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>1.12.487</version>
    </dependency>

图片上传流程分为两步:获取上传地址和提交上传记录


#### 获取上传地址


1.这是获取上传地址接口,这里把用户id放入FileUploadBo就进入putuploadService业务层代码。前端传过来FileUploadBo 包括category图片分类,fileName文件名,fileSize图片大小,fileMd5图片的md5值。



@Autowired
PutuploadService putuploadService;


/**
 * 获取上传地址
 *
 * @return 每一张图片一个上传地址
 */
@SaCheckLogin
@PostMapping("getPutUploadUrl")
public ResultBody getPutUploadUrl(@RequestBody FileUploadBo bo) {

    //从缓存拿到用户信息
    UserBo userInfo = MyUtils.getUserInfo();
    if (userInfo == null) {
        return ResultBody.error(CommonEnum.USER_IS_NULL);
    }
    //用户ID
    String userId = userInfo.getUserId();
    //判断下上传的文件是否为空
    if (bo == null) {
        return ResultBody.error(CommonEnum.FILE_LIST_IS_NULL);
    }
    //拼接用户ID
    bo.setUserId(userId);

    // 业务实现
    return putuploadService.getPutUploadUrl(bo);
}

2.我们先看trans服务里的代码,因为putuploadService需要远程调用它。首先根据图片的md5值来查询是否有相同的图片已经上传过,这样的话就可以节省资源。如果图片已存在则称为秒传。如果图片存在的话我们直接返回storageObjectId(图片的存储id,这是数据库的主键)即可,因为图片已经上传过了,已经不需要拿他的上传地址了。如果图片不存在则需要进行图片上传,调用S3Util来进行上传,然后返回S3Util生成的返回值,重点是图片上传地址。


\*\*\*注意,秒传和非秒传返回值是不同的\*\*\*



 @Autowired
IFileMd5Service iFileService;
    
public String getPutUploadUrl(String fileName, String fileMd5, Long fileSize) {
    //文件已存在 进行秒传 直接将存储id返回
    FileMd5 fileMd5Entity = iFileService.getOne(new QueryWrapper<FileMd5>().eq("md5", fileMd5));
    if (fileMd5Entity != null) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("storageObjectId", fileMd5Entity.getStorageObjectId());
        return jsonObject.toJSONString();
    }

    //文件不存在
    String suffixName = "";
    if (StringUtils.isNotBlank(fileName)) {//检查fileName为不为空
        suffixName = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
    }
    return S3Util.getPutUploadUrl(suffixName, fileMd5);//上传图片,返回上传信息
}

3.然后我们看看S3Util的代码。主要就是把图片上传到Minio,也可以选择服务商的桶服务存储,原理是差不多的,我选择的是Minio。原理就是先建立连接然后将文件的md5转换为base64上传到Minio存储,然后返回上传信息。这里的代码会用即可。



package com.cloud.photo.common.util;

import cn.hutool.core.codec.Base64;
import com.alibaba.fastjson.JSONObject;
import com.amazonaws.HttpMethod;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import io.micrometer.core.instrument.util.StringUtils;
import org.apache.tomcat.util.buf.HexUtils;

import java.io.;
import java.net.URL;
import java.net.URLEncoder;
import java.util.
;

public class S3Util {

private static String accessKey = "minioadmin";
private static String secretKey = "minioadmin";
private static String bucketName = "cloud-photo";
private static String serviceEndpoint = "http://127.0.0.1:9000";


private static String containerId = "10001";

/**
 * 获取上传地址
 * @param suffixName
 * @param fileMd5
 * @return
 */
public static String getPutUploadUrl(St
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值