【Easy云盘 | 第二篇】后端统一设计思想

在这里插入图片描述

文章目录

    • 4.1后端统一设计思想
      • 4.1.1后端统一返回格式对象
      • 4.1.2后端统一响应状态码
      • 4.1.3后端统一异常处理类
      • 4.1.4StringUtils类
      • 4.1.5 RedisUtils类

4.1后端统一设计思想

4.1.1后端统一返回格式对象

  • com.easypan.entity.vo.ResponseVO
@Data
public class ResponseVO<T> {
    private String status;
    private Integer code;	//响应状态码
    private String info;	//响应消息
    private T data;			//响应数据
}

4.1.2后端统一响应状态码

  • com.easypan.entity.enums.ResponseCodeEnum
public enum ResponseCodeEnum {
    CODE_200(200, "请求成功"),
    CODE_404(404, "请求地址不存在"),
    CODE_600(600, "请求参数错误"),
    CODE_601(601, "信息已经存在"),
    CODE_500(500, "服务器返回错误,请联系管理员"),
    CODE_901(901, "登录超时,请重新登录"),
    CODE_902(902, "分享连接不存在,或者已失效"),
    CODE_903(903, "分享验证失效,请重新验证"),
    CODE_904(904, "网盘空间不足,请扩容");

    private Integer code;	//状态码
    private String msg;		//状态码对应的信息

    ResponseCodeEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

4.1.3后端统一异常处理类

  • com.easypan.exception.BusinessException
@Data
@AllArgsConstructor
public class BusinessException extends RuntimeException {

    private ResponseCodeEnum codeEnum;  //后端统一响应状态码
    private Integer code;               //自定义code值
    private String message;             //自定义消息

    public BusinessException(String message, Throwable e) {
        super(message, e);
        this.message = message;
    }

    public BusinessException(String message) {
        super(message);
        this.message = message;
    }

    public BusinessException(Throwable e) {
        super(e);
    }

    /**
     * @Description: 根据指定codeEnum创建Exception对象
     */
    public BusinessException(ResponseCodeEnum codeEnum) {
        super(codeEnum.getMsg());
        this.codeEnum = codeEnum;
        this.code = codeEnum.getCode();
        this.message = codeEnum.getMsg();
    }
    
    /**
     * @Description: 自定义code、message来创建Exception对象
     */
    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
        this.message = message;
    }

    /**
     * 重写fillInStackTrace 业务异常不需要堆栈信息,提高效率.
     */
    @Override
    public Throwable fillInStackTrace() {
        return this;
    }

}

4.1.4StringUtils类

  • com.easypan.utils.StringUtils
public class StringUtils {

    public static String encodeByMD5(String originString) {
        return StringUtils.isEmpty(originString) ? null : DigestUtils.md5Hex(originString);
    }

    public static boolean isEmpty(String str) {

        if (null == str || "".equals(str) || "null".equals(str) || "\u0000".equals(str)) {
            return true;
        } else if ("".equals(str.trim())) {
            return true;
        }
        return false;
    }

    public static String getFileSuffix(String fileName) {
        Integer index = fileName.lastIndexOf(".");
        if (index == -1) {
            return "";
        }
        String suffix = fileName.substring(index);
        return suffix;
    }


    public static String getFileNameNoSuffix(String fileName) {
        Integer index = fileName.lastIndexOf(".");
        if (index == -1) {
            return fileName;
        }
        fileName = fileName.substring(0, index);
        return fileName;
    }

    public static String rename(String fileName) {
        String fileNameReal = getFileNameNoSuffix(fileName);
        String suffix = getFileSuffix(fileName);
        return fileNameReal + "_" + getRandomString(Constants.LENGTH_5) + suffix;
    }

    public static final String getRandomString(Integer count) {
        return RandomStringUtils.random(count, true, true);
    }

    public static final String getRandomNumber(Integer count) {
        return RandomStringUtils.random(count, false, true);
    }


    public static String escapeTitle(String content) {
        if (isEmpty(content)) {
            return content;
        }
        content = content.replace("<", "&lt;");
        return content;
    }


    public static String escapeHtml(String content) {
        if (isEmpty(content)) {
            return content;
        }
        content = content.replace("<", "&lt;");
        content = content.replace(" ", "&nbsp;");
        content = content.replace("\n", "<br>");
        return content;
    }

    public static boolean pathIsOk(String path) {
        if (StringUtils.isEmpty(path)) {
            return true;
        }
        if (path.contains("../") || path.contains("..\\")) {
            return false;
        }
        return true;
    }
}

4.1.5 RedisUtils类

  • com.easypan.utils.RedisUtils
@Slf4j
@Component("redisUtils")
public class RedisUtils<V> {

    @Resource
    private RedisTemplate<String, V> redisTemplate;

    /**
     * 普通缓存放入
     * @param key   键
     * @param value 值
     * @return true成功 false失败
     */
    public boolean set(String key, V value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            log.error("设置redisKey:{},value:{}失败", key, value);
            return false;
        }
    }

    /**
     * 普通缓存放入并设置时间
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @return true成功 false 失败
     */
    public boolean setex(String key, V value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            } else {
                set(key, value);
            }
            return true;
        } catch (Exception e) {
            log.error("设置redisKey:{},value:{}失败", key, value);
            return false;
        }
    }

    //获取指定key的value值
    public V get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }


    /**
     * 删除缓存,key 可以传一个值 或多个
     */
    public void delete(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                redisTemplate.delete(key[0]);
            } else {
                redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(key));
            }
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/522955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux网络编程】网络编程套接字(TCP服务器)

【Linux网络编程】网络编程套接字(TCP服务器) 目录 【Linux网络编程】网络编程套接字(TCP服务器)地址转换函数关于inet_ntoa 简单的TCP网络程序TCP sockot API详解socket()bind()listen()accept();connect 完整的TCP服务器代码&#xff08;线程池版&#xff09; 作者&#xff1…

Qt+OpenGL-part3

1-4EBO画矩形_哔哩哔哩_bilibili 可以绘制两个三角形来组成一个矩形&#xff08;OpenGL主要处理三角形&#xff09; 直接画两个三角形&#xff1a; #include "openglwidget.h" #include <QDebug>unsigned int VBO,VAO; unsigned int shaderProgram;//顶点着…

GAMES Webinar 317-渲染专题-图形学 vs. 视觉大模型|Talk+Panel形式

两条路线&#xff1a;传统渲染路线&#xff0c;生成路线 两种路线的目的都是最终生成图片或者视频等在现在生成大火的情况下&#xff0c;传统路线未来该如何发展呢&#xff0c;两种路线是否能够兼容呢 严令琪 这篇工作是吸取这两条路各自优势的一篇工作 RGB是一张图&#xff…

Kubernetes学习笔记7

使用kubeadm部署Kubernetes集群方法 使用kubernetes部署单节点Master节点K8s集群。 在实际生产环境中&#xff0c;是不允许单master节点的&#xff0c;如果单master节点不可用的话&#xff0c;当导致我们的K8s集群无法访问。 可以使用kubeadm将单master节点升级为多master节点…

客户银行主数据批导

程序&#xff1a;ZSDR0005 *&---------------------------------------------------------------------* *& Report ZSDR0005 *&---------------------------------------------------------------------* *& *&----------------------------------------…

C++ //练习 11.23 11.2.1节练习(第378页)中的map以孩子的姓为关键字,保存他们的名的vector,用multimap重写此map。

C Primer&#xff08;第5版&#xff09; 练习 11.23 练习 11.23 11.2.1节练习&#xff08;第378页&#xff09;中的map以孩子的姓为关键字&#xff0c;保存他们的名的vector&#xff0c;用multimap重写此map。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09;…

使用LIMIT进行分页

SELECT employee_id, first_name, salary FROM employees LIMIT 0, 5; 0为偏移量&#xff0c; 5为条目数 每页pageSize条记录&#xff0c;显示第page页 LIMIT (page - 1) * pageSize, pageSize; # 或者 LIMIT pageSize OFFSET (page - 1) * pageSize;

主食冻干哪个牌子好?热门大牌真实实测分享,轻松避雷!

在选购主食冻干时&#xff0c;很多铲屎官都面临着选进口还是国产的难题。很多铲屎官认为进口产品在品控和配方上更优秀&#xff0c;但实际营养指标却逊于国产&#xff0c;价格也不菲。所以不免选购时会犹豫&#xff0c;最后抱着试一试的心态盲入主食冻干&#xff0c;运气好&…

如何利用GSG-721与ublox GNSS接收机实现RTK功能仿真?

作者介绍 一、前言 实时动态载波相位差分技术&#xff08;RTK&#xff09;是应用测量来纠正当前卫星导航&#xff08;GNSS&#xff09;系统的常见误差。RTK定位是基于至少两个GNSS接收机——参考站和一个或多个流动站。参考站在可视卫星中获取测量数据&#xff0c;然后将这些数…

numpy,matplotilib学习(菜鸟教程)

所有内容均来自于&#xff1a; NumPy 教程 | 菜鸟教程 Matplotlib 教程 | 菜鸟教程 numpy模块 numpy.nditer NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。 for x in np.nditer(a, orderF):Fortran order&#xff0c;即是列序优先&#x…

离职潮下的企业信息安全挑战及防范策略

随着社会经济环境的快速变化&#xff0c;企业员工流动性加剧&#xff0c;尤其在离职潮下&#xff0c;企业不仅要关注人力资源配置与团队稳定性&#xff0c;更要重视由此引发的信息安全挑战。离职员工带走的不仅仅是职位空缺&#xff0c;更可能携带着大量内部敏感信息&#xff0…

分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支…

基于单片机便携式太阳能充电器系统设计

**单片机设计介绍&#xff0c;基于单片机便携式太阳能充电器系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机便携式太阳能充电器系统设计概要主要涉及利用单片机作为核心控制器件&#xff0c;结合太阳能充电技术和便携式…

基于SpringBoot+微信小程序的智慧医疗线上预约问诊小程序

一、项目背景介绍&#xff1a; 近年来&#xff0c;随着互联网技术的不断发展&#xff0c;人们的生活和工作方式也在逐渐改变。其中&#xff0c;医疗行业也受到了极大的影响。由于传统医疗行业存在着很多问题&#xff0c;例如就医难、看病贵等&#xff0c;因此出现了许多新型医疗…

窜天猴AI直播软件功能列表

迎新点名&#xff1a;新进直播间的用户随机指数级自由组合话术&#xff0c;并播报出来 礼物/关注&#xff1a;用户送礼物、关注以及灯牌事件同上根据话术指数级随机组合出来评论区关键字回复&#xff1a;用户评论后&#xff0c;根据预设置的关键字进行语音回复 自动寻品&…

蓝桥杯算法心得——字典树考试(贡献度+前缀和)

大家好&#xff0c;我是晴天学长&#xff0c;贡献度的题&#xff0c;找到技巧非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .字典树考试 字典树考试 问题描述 蓝桥学院最近教学了字典树这一数…

C51_串口通信

通信协议介绍 并行通信和串口通信 并行通信的各个位同时传输&#xff0c;每一位数据都需要一条传输线。优点是传输快&#xff0c;适合短距离传输&#xff0c;但是成本高串行通信将数据分成位的形式&#xff0c;在一条传输线上逐个传输 单工、半双工和全双工数据传输 单工数…

C语言之联合体

与结构体一样&#xff0c;联合体也是由多个成员组成&#xff0c;但是编译器只为最大的成员分配足够的空间&#xff0c;联合体的所有成员共用一块空间&#xff0c;所以联合体也叫共用体。 1.声明&#xff1a;类似结构体的声明&#xff0c;只是名字是union不是struct。声明并计算…

大模型学习笔记一

前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 一、AI是什么&#xff1f; 二、大模型能干什么 大模型&#xff0c;全称「大语言模型」&#xff0c;英文「Large…