本文共 4924 字,大约阅读时间需要 16 分钟。
可以直接将代码生成器中生成的前端代码拷贝到前端页面,从而实现简单的功能,只需根据业务需求做相应的修改即可。
brand.vue
和brand-and-or-update.vue
两个页面拷贝到项目中。由于生成的代码中有权限功能,只有有权限的时候才会生成显示添加和删除等按钮,所以我们现将权限获取全部设置为true,后期再来验证权限。
显示状态栏是通过0,1来展示是否显示,我们需要通过按钮来显示。
采用阿里云的OSS来存储文件,方式:用户向应用服务器请求上传policy,应用服务器返回上传policy,用户直接上传数据到OSS,而不是采用用户将图片传给应用服务器,然后再由应用服务器上传到OSS,因为会增加应用服务器负担。
创建一个第三方工具模块gulimall-third-party
com.hjf.gulimall gulimall-common 0.0.1-SNAPSHOT com.baomidou mybatis-plus-boot-starter org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-openfeign org.springframework.boot spring-boot-starter-test test com.alibaba.cloud spring-cloud-starter-alicloud-oss
spring.application.name=gulimall-third-partyspring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.namespace=4c9b6122-5d5d-4700-ade2-eaaf5dae222dspring.cloud.nacos.config.ext-config[0].data-id=oss.ymlspring.cloud.nacos.config.ext-config[0].group=devspring.cloud.nacos.config.ext-config[0].refresh=true
@RestControllerpublic class OssController { @Autowired private OSS ossClient; @Value("${spring.cloud.alicloud.access-key}") private String accessId; @Value("${spring.cloud.alicloud.oss.endpoint}") private String endpoint; @Value("${spring.cloud.alicloud.oss.bucket}") private String bucket; @RequestMapping("/oss/policy") public Mappolicy(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String host = "https://" + bucket + "." + endpoint; 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(); 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)); return respMap; }}
配置网关路由
spring: cloud: gateway: routes: - id: third_party_route uri: lb://gulimall-third-party predicates: - Path=/api/thirdparty/** filters: - RewritePath=/api/thirdparty/(?.*),/$\{segment}
将文件夹中的upload
目录拷贝到src/components
中。
此时上传文件时会出现跨域问题,因为我们是通过客户端直接上传的。
在阿里云oss中修改权限管理,允许oss可以跨域访问。
主要校验首字母和排序两个字段。
采用JSR303校验,实体中添加注解,并定义自己的message提示。
创建分组接口,修改实体类,给校验注解标注什么情况下才需要验证。
编写自定义的校验注解,编写自定义的校验器,关联自定义的校验器和自定义的校验注解。
为每个方法编写异常处理方法,太过麻烦,同时会使controller层逻辑复杂,所以我们使用统一异常处理。
创建异常处理类,集中处理各种异常。
创建错误码枚举类。
public enum BizCodeEnume { UNKNOW_EXCEPTION(10000, "系统未知异常"), VALID_EXCEPTION(10001, "参数格式化失败"); private int code; private String msg; BizCodeEnume(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public String getMsg() { return msg; }}
创建异常处理类,集中处理各种异常。
@Slf4j@RestControllerAdvice(basePackages = "com.hjf.gulimall.product.controller")public class GulimallExceptionControllerAdvice { @ExceptionHandler(value = MethodArgumentNotValidException.class) public R handleValidException(MethodArgumentNotValidException e) { log.error("数据校验出现问题 {}, 异常类型: {}", e.getMessage(), e.getClass()); BindingResult bindingResult = e.getBindingResult(); MaperrorMap = new HashMap<>(); bindingResult.getFieldErrors().forEach((item) -> { errorMap.put(item.getField(), item.getDefaultMessage()); }); return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(), BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data", errorMap); } @ExceptionHandler(value = Throwable.class) public R handleException(Throwable throwable) { return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(), BizCodeEnume.UNKNOW_EXCEPTION.getMsg()); }}
转载地址:http://mtum.baihongyu.com/