谷粒商城【成神路】-【5】——品牌管理【上】

news2024/11/20 23:39:04

目录

🧈1.新建品牌分类

🥞2.导入前端代码 

🧂3.页面优化 

🥓4.阿里云开通oss 

🌭5.文件上传 

🥚6.表单后端校验 JSR303


1.新建品牌分类

在renren-fast客户端中,创建二级菜单,注意菜单的路由

2.导入前端代码 

  • 在使用逆向生成工具的时候,已经将前端代码生成直接放入到product目录下即可

3.页面优化 

  • 在导入代码后,对页面进行优化,如显示状态,利用elementUI;代码全部放到文章最后

4.阿里云开通oss 

  • 登录阿里云,开通oss对象存储,让log的地址存储到阿里云上

5.文件上传 

使用spring cloud Alibaba-oss,并将其创建第三方模块

参考官方文档:spring cloudAlibaba-oss

  • 1.导入依赖

spring boot和cloud的版本不要过高

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
        </dependency>
  • 2.在配置文件中添加配置

1.将其注册到服务中心

2.配置中心
3.微服务名称

4.端口号

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.20.50:1111
      config:
        server-addr: 192.168.20.50:1111
        namespace: 75307413-52f9-4045-8d34-abaceeced6de
    alicloud:
      access-key: =====8DK3oQbqru1Zsyjezy
      secret-key: =====zNIZTc4QjUxEMY78ZyWCbkrIY
      oss:
       endpoint: =====beijing.aliyuncs.com
       bucket: hqdmdxz-gulimall

  application:
    name: gulimall-third-party

server:
  port: 30000
  • 3.设置 子账户以及读权限

  •  4.编写controller
@RestController
public class OssController {

    @Autowired
    OSS ossClient;

    @Value("${spring.cloud.alicloud.oss.endpoint}")
    private String endpoint;
    @Value("${spring.cloud.alicloud.oss.bucket}")
    private String bucket;

    @Value("${spring.cloud.alicloud.access-key}")
    private String accessId;

  

    @RequestMapping("/oss/policy")
    public R policy() {


        //https://hqdmdxz-gulimall.oss-cn-beijing.aliyuncs.com/hahaha.jpg

        String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint
        // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
//        String callbackUrl = "http://88.88.88.88:8888";
        String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String dir = format + "/"; // 用户上传文件时指定的前缀。

        Map<String, String> respMap = null;
        try {
            long expireTime = 30;
            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
            Date expiration = new Date(expireEndTime);
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);

            String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = ossClient.calculatePostSignature(postPolicy);

            respMap = new LinkedHashMap<String, String>();
            respMap.put("accessid", accessId);
            respMap.put("policy", encodedPolicy);
            respMap.put("signature", postSignature);
            respMap.put("dir", dir);
            respMap.put("host", host);
            respMap.put("expire", String.valueOf(expireEndTime / 1000));
            // respMap.put("expire", formatISO8601Date(expiration));


        } catch (Exception e) {
            // Assert.fail(e.getMessage());
            System.out.println(e.getMessage());
        }

        return R.ok().put("data",respMap);
    }
}
  • 5.解决阿里云跨域

在阿里云上设置跨域设置,允许所有post请求

6.表单后端校验 JSR303

  • 1.添加校验注解,所有包javax.validation.constraints 

  • 2.开启校验注解@Valid 

  •  3.给校验的bean后紧跟BindingResult,就可以获取到校验的结果
@RequestMapping("/save")
    //@RequiresPermissions("product:brand:save")
    public R save(@Valid @RequestBody BrandEntity brand, BindingResult result) {
        if (result.hasErrors()) {
            Map<String,String> map=new HashMap<>();
            //1.获取校验的结果
            result.getFieldErrors().forEach((item)->{
                //2.获取的错误提示
                String message = item.getDefaultMessage();
                //3.获取错误的属性的名字
                String field = item.getField();
                map.put(field,message);
            });
            return R.error(400,"提交的数据不合法").put("data",map);
        } else {
            brandService.save(brand);
        }
        return R.ok();
    }
  • 4..使用postman测试 

  • 5.统一异常处理 @ControllerAdvice

上面的单个返回异常会反复操作,我们不使用BindingResult,而是使用一个类封装所有异常信息,当校验出现错误时,直接去异常嘞找即可。

  • @ControllerAdvice注解是一个全局异常处理器,用于处理控制器层(Controller层)的异常。
@Slf4j
//RestControllerAdvice=@ControllerAdvice+@ResponseBody
@RestControllerAdvice(basePackages = "com.xz.gulimall.product.controller")
public class GuLiMallExceptionControllerAdvice {


    //精确匹配
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleVaildException(MethodArgumentNotValidException e) {
        log.error("数据校验出现问题{},异常类型{}", e.getMessage(), e.getClass());
        BindingResult result = e.getBindingResult();
        Map<String, String> map = new HashMap<>();
        result.getFieldErrors().forEach((fieldError) -> {
            map.put(fieldError.getField(), fieldError.getDefaultMessage());
        });
        return R.error(BizCodeEnume.VALD_EXCEPTION.getCode(), BizCodeEnume.VALD_EXCEPTION.getMsg()).put("data", map);
    }

    //兜底异常处理
    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable) {
        return R.error(BizCodeEnume.UNKONW_EXCEPTION.getCode(),BizCodeEnume.UNKONW_EXCEPTION.getMsg());
    }
}

 在之后,我们所有的异常直接抛出,全都用异常类处理,这也产生一个问题,就是状态码不统一,如何使用不同的状态码》》》》我们在公共模块封装一个状态码枚举

/**
 * 定义系统状态码
 */
public enum BizCodeEnume {
    UNKONW_EXCEPTION(10000, "系统未知异常"),
    VALD_EXCEPTION(10001,"参数格式校验失败");

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

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

之后直接待用枚举中相对应的状态码和异常信息即可~ 

  • 6.分组校验

1.给校验注解标注什么时候开始校验 

2.使用@ValidDated,标记校验分组

注:不添加分组校验,添加的校验功能注解是不生效的

 @RequestMapping("/save")
    //@RequiresPermissions("product:brand:save")
    public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand /*,BindingResult result*/) {
            brandService.save(brand);
        return R.ok();
    }
  • 7.自定义校验注解 

1.编写一个自定义的校验注解,并创建配置文件

@Documented
@Constraint(
        validatedBy = {
                ListValueConstrainValidator.class//自定义校验器,与注解产生关联
        }
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
    String message() default "{com.xz.common.vaild.ListValue.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    int[] vals() default {};
}

2.自定义校验器

public class ListValueConstrainValidator implements ConstraintValidator<ListValue,Integer> {

    private Set<Integer> set=new HashSet<>();
    //初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] vals = constraintAnnotation.vals();
        for (int val: vals){
            set.add(val);
        }
    }

    //判断是否校验成功

    /**
     *
     * @param value : 需要校验的值
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return set.contains(value);
    }
}

3.校验注解与校验器产生关系,在注解中添加校验器类

​​​

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于CNN+LSTM深度学习网络的时间序列预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 长短时记忆网络&#xff08;LSTM&#xff09; 4.3 CNNLSTM网络结构 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MA…

微信自动预约小程序开发指南:从小白到专家

在数字化时代&#xff0c;预约小程序已成为各类服务行业的必备工具。本文将指导你从零开始&#xff0c;通过第三方小程序制作平台&#xff0c;顺利开发出一款具有预约功能的实用小程序。 第一步&#xff1a;注册登录第三方小程序制作平台 首先&#xff0c;你需要选择一个适合你…

麻雀搜索算法|Sparrow Search Algorithm(SSA)

在麻雀群体智慧、觅食和反捕食行为的启发下&#xff0c;提出了一种新的群体优化方法&#xff0c;即麻雀搜索算法&#xff08;SSA&#xff09;。 1、简介 在麻雀搜索算法中包含三种类型的麻雀个体&#xff0c;即发现者、跟随者和侦察者&#xff0c;三种类型对应三种行为。发现…

Intellij IDEA各种调试+开发中常见bug

Intellij IDEA中使用好Debug&#xff0c;主要包括如下内容&#xff1a; 一、Debug开篇 ①、以Debug模式启动服务&#xff0c;左边的一个按钮则是以Run模式启动。在开发中&#xff0c;我一般会直接启动Debug模式&#xff0c;方便随时调试代码。 ②、断点&#xff1a;在左边行…

下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置

自己编译 OpenCV 挺麻烦的&#xff0c;配置需要耗费很长时间&#xff0c;编译也需要很长时间&#xff0c;而且无法保证能全部编译通过。利用 OpenCV 官网提供的已编译的 OpenCV 库可以节省很多时间。下面介绍安装配置方法。 1. OpenCV 官网 地址是&#xff1a;https://opencv…

用GOGS搭建GIT服务器

GOGS官网 Gogs: A painless self-hosted Git service 进入文件所在目录 cd /usr/local/develop 解压文件 tar -xvf gogs_0.13.0_linux_amd64.tar.gz 解压之后 进入gogs 目录 cd gogs 创建几个目录 userdata 存放用户数据 log文件存放进程日志 repositories 仓库根目…

数字孪生:智慧城市的核心技术与发展

一、引言 随着城市化进程的加速&#xff0c;智慧城市的概念和实践逐渐成为全球关注的焦点。智慧城市利用先进的信息通信技术&#xff0c;提升城市治理水平&#xff0c;改善市民的生活质量。而数字孪生作为智慧城市的核心技术&#xff0c;为城市管理、规划、应急响应等方面提供…

一维差分,二维差分(详解+例题)

一、一维差分 1.1、解释&#xff1a; 设数列an&#xff0c;记an为数列bn的前n项和 原数组&#xff1a;a[1],a[2],a[3],a[4]..................a[n]; 构造一个数组b&#xff1a;b[1],b[2],b[3],b[4].................b[i]; 使得a[i] b[1] b[2] b[3] ........ b[i]; 也就是…

SpringBoot:配置相关知识点

SpringBoot&#xff1a;多环境配置 配置知识点demo&#xff1a;点击查看LearnSpringBoot02 点击查看更多的SpringBoot教程 一、SpringBootApplication SpringBootApplication 来标注一个主程序类&#xff0c;说明这是一个Spring Boot应用&#xff0c;运行这个类的main方法来…

并查集实现|并查集在相关题目中的应用|手撕数据结构专栏

前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 高质量干货博客汇总http://t.csdnimg.cn/jdQXqGit企业开发控制理论和实操http://t.csdnimg.cn/PyPJeDocker从认识到实践再到底层原理http://t.csdnimg.cn/G6Inp手撕数据结构http://t.csdnimg.cn/XeyJn 这里是很…

IT行业证书的获取与价值:提升职业竞争力的关键

目录 IT行业证书的价值和作用 1. Cisco&#xff08;思科&#xff09;认证&#xff08;如CCNA、CCNP、CCIE&#xff09;&#xff1a; 2. 微软认证&#xff08;如MCSA、MCSE、MCSD&#xff09;&#xff1a; 3. 计算机网络技术&#xff08;CompTIA Network、CompTIA Security&a…

智慧城市:打造低碳未来,引领城市数字化转型新篇章

在“万物皆可数字化”的新时代浪潮下&#xff0c;智慧城市作为未来城市发展的先锋方向&#xff0c;正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志&#xff0c;更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…

C++之字符串

C风格字符串 字符串处理在程序中应用广泛&#xff0c;C风格字符串是以\0&#xff08;空字符&#xff09;来结尾的字符数组。对字符串进行操作的C函数定义在头文件<string.h>或中。常用的库函数如下&#xff1a; //字符检查函数(非修改式操作) size_t strlen( const char …

sqli.labs靶场(54-65关)

54、第五十四关 提示尝试是十次后数据库就重置&#xff0c;那我们尝试union 原来是单引号闭合 id-1 union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schemadatabase()) -- 数据库&#xff1a;challenges&#xff0c…

Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)

目录 **Spring5** 框架新功能系列一Spring 5.0 框架自带了通用的日志封装Spring5 **框架核心容器**支持Nullable **注解****Spring5** **核心容器支持函数式风格** GenericApplicationContext**Spring5** **支持整合** JUnit5感谢阅读 开篇: 欢迎再次来到 Spring 5 学习系列&am…

图解支付-金融级密钥管理系统:构建支付系统的安全基石

经常在网上看到某某公司几千万的个人敏感信息被泄露&#xff0c;这要是放在持牌的支付公司&#xff0c;可能就是一个非常大的麻烦&#xff0c;不但会失去用户的信任&#xff0c;而且可能会被吊销牌照。而现实情况是很多公司的技术研发人员并没有足够深的安全架构经验来设计一套…

【2024美赛E题】985博士解题思路分析(持续更新中)!

【2024美赛E题】985博士解题思路分析&#xff01; 加群可以享受定制等更多服务&#xff0c;或者搜索B站&#xff1a;数模洛凌寺 联络组织企鹅&#xff1a;936670395 以下是E题老师的解题思路&#xff08;企鹅内还会随时更新文档&#xff09;&#xff1a; 2024美赛E题思路详解…

Unity3d Cinemachine篇(完)— TargetGroup

文章目录 前言使用TargetGroup追随多个模型1. 创建二个游戏物体2. 创建TargetGroup相机3. 设置相机4. 完成 前言 上一期我们简单的使用了ClearShot相机&#xff0c;这次我们来使用一下TargetGroup 使用TargetGroup追随多个模型 1. 创建二个游戏物体 2. 创建TargetGroup相机 3…

1-3 动手学深度学习v2-线性回归的从零开始实现-笔记

手动创建训练数据集 根据带有噪声的线性模型构造一个人造数据集。我们使用线性模型参数 w [ 2 , − 3.4 ] T \pmb{w} [2,-3.4]^{T} w[2,−3.4]T、 b 4.2 b 4.2 b4.2和噪声项 ϵ \epsilon ϵ生成数据集及其标签&#xff1a; y X w b ϵ \pmb{y} \pmb{Xw}b\epsilon yXw…

挑战!贪吃蛇小游戏的实现(1)

引言 相信大家都玩过贪吃蛇这个游戏&#xff01; 玩家控制一个不断移动的蛇形角色&#xff0c;在一个封闭空间内移动。随着时间推进&#xff0c;这个蛇形角色会逐渐增长&#xff0c;通常是通过吞食屏幕上出现的物品&#xff08;如点或者其他标志&#xff09;来实现。每当贪吃…