diff --git a/admin/src/main/java/cn/lili/admin/AdminApplication.java b/admin/src/main/java/cn/lili/admin/AdminApplication.java index d88d42e3..68c232ba 100644 --- a/admin/src/main/java/cn/lili/admin/AdminApplication.java +++ b/admin/src/main/java/cn/lili/admin/AdminApplication.java @@ -37,11 +37,11 @@ public class AdminApplication { successHandler.setDefaultTargetUrl(this.adminServer.path("/")); http.authorizeRequests().antMatchers("/instances**").permitAll(); http.authorizeRequests( - (authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll() // 授予公众对所有静态资产和登录页面的访问权限。 + (authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll() //授予公众对所有静态资产和登录页面的访问权限。 .antMatchers(this.adminServer.path("/login")).permitAll().anyRequest().authenticated() //其他所有请求都必须经过验证。 ).formLogin( - (formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and() // 配置登录和注销。 - ).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults()) // 启用HTTP基本支持。这是Spring Boot Admin Client注册所必需的。 + (formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and() //配置登录和注销。 + ).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults()) //启用HTTP基本支持。这是Spring Boot Admin Client注册所必需的。 .csrf().disable() .rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600)); } diff --git a/buyer-api/src/main/java/cn/lili/controller/trade/CartController.java b/buyer-api/src/main/java/cn/lili/controller/trade/CartController.java index fce86afd..8150f750 100644 --- a/buyer-api/src/main/java/cn/lili/controller/trade/CartController.java +++ b/buyer-api/src/main/java/cn/lili/controller/trade/CartController.java @@ -50,8 +50,17 @@ public class CartController { public ResultMessage add(@NotNull(message = "产品id不能为空") String skuId, @NotNull(message = "购买数量不能为空") @Min(value = 1, message = "加入购物车数量必须大于0") Integer num, String cartType) { - cartService.add(skuId, num, cartType); - return ResultUtil.success(); + try { + //读取选中的列表 + cartService.add(skuId, num, cartType); + return ResultUtil.success(); + } catch (ServiceException se) { + log.info(se.getMsg(), se); + return ResultUtil.error(se.getResultCode().code(), se.getResultCode().message()); + } catch (Exception e) { + log.error(ResultCode.CART_ERROR.message(), e); + throw new ServiceException(ResultCode.CART_ERROR); + } } @@ -148,10 +157,11 @@ public class CartController { @GetMapping("/checked") public ResultMessage cartChecked(@NotNull(message = "读取选中列表") String way) { try { - // 读取选中的列表 + //读取选中的列表 return ResultUtil.data(this.cartService.getCheckedTradeDTO(CartTypeEnum.valueOf(way))); - } catch (ServiceException e) { - throw e; + } catch (ServiceException se) { + log.error(se.getMsg(), se); + return ResultUtil.error(se.getResultCode().code(), se.getResultCode().message()); } catch (Exception e) { log.error(ResultCode.CART_ERROR.message(), e); throw new ServiceException(ResultCode.CART_ERROR); @@ -193,6 +203,9 @@ public class CartController { try { cartService.shippingMethod(selleId, shippingMethod, way); return ResultUtil.success(); + } catch (ServiceException se) { + log.error(se.getMsg(), se); + return ResultUtil.error(se.getResultCode().code(), se.getResultCode().message()); } catch (Exception e) { log.error(ResultCode.CART_ERROR.message(), e); throw new ServiceException(ResultCode.CART_ERROR); @@ -226,10 +239,11 @@ public class CartController { @PostMapping(value = "/create/trade", consumes = "application/json", produces = "application/json") public ResultMessage crateTrade(@RequestBody TradeParams tradeParams) { try { - // 读取选中的列表 + //读取选中的列表 return ResultUtil.data(this.cartService.createTrade(tradeParams)); - } catch (ServiceException e) { - throw e; + } catch (ServiceException se) { + log.error(se.getMsg(), se); + return ResultUtil.error(se.getResultCode().code(), se.getResultCode().message()); } catch (Exception e) { log.error(ResultCode.ORDER_ERROR.message(), e); throw new ServiceException(ResultCode.ORDER_ERROR); diff --git a/buyer-api/src/main/java/cn/lili/security/BuyerAuthenticationFilter.java b/buyer-api/src/main/java/cn/lili/security/BuyerAuthenticationFilter.java index 71fddde1..2b7134af 100755 --- a/buyer-api/src/main/java/cn/lili/security/BuyerAuthenticationFilter.java +++ b/buyer-api/src/main/java/cn/lili/security/BuyerAuthenticationFilter.java @@ -67,7 +67,7 @@ public class BuyerAuthenticationFilter extends BasicAuthenticationFilter { //从header中获取jwt String jwt = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); try { - // 如果没有token 则return + //如果没有token 则return if (StrUtil.isBlank(jwt)) { chain.doFilter(request, response); return; @@ -99,7 +99,7 @@ public class BuyerAuthenticationFilter extends BasicAuthenticationFilter { String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString(); AuthUser authUser = new Gson().fromJson(json, AuthUser.class); - // 校验redis中是否有权限 + //校验redis中是否有权限 if (cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + jwt)) { //构造返回信息 List auths = new ArrayList<>(); diff --git a/buyer-api/src/main/java/cn/lili/security/BuyerSecurityConfig.java b/buyer-api/src/main/java/cn/lili/security/BuyerSecurityConfig.java index 81815fe9..779e0d78 100644 --- a/buyer-api/src/main/java/cn/lili/security/BuyerSecurityConfig.java +++ b/buyer-api/src/main/java/cn/lili/security/BuyerSecurityConfig.java @@ -48,35 +48,35 @@ public class BuyerSecurityConfig extends WebSecurityConfigurerAdapter { ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = http .authorizeRequests(); - // 配置的url 不需要授权 + //配置的url 不需要授权 for (String url : ignoredUrlsProperties.getUrls()) { registry.antMatchers(url).permitAll(); } registry .and() - // 禁止网页iframe + //禁止网页iframe .headers().frameOptions().disable() .and() .logout() .permitAll() .and() .authorizeRequests() - // 任何请求 + //任何请求 .anyRequest() - // 需要身份认证 + //需要身份认证 .authenticated() .and() - // 允许跨域 + //允许跨域 .cors().configurationSource((CorsConfigurationSource) SpringContextUtil.getBean("corsConfigurationSource")).and() - // 关闭跨站请求防护 + //关闭跨站请求防护 .csrf().disable() - // 前后端分离采用JWT 不需要session + //前后端分离采用JWT 不需要session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() - // 自定义权限拒绝处理类 + //自定义权限拒绝处理类 .exceptionHandling().accessDeniedHandler(accessDeniedHandler) .and() - // 添加JWT认证过滤器 + //添加JWT认证过滤器 .addFilter(new BuyerAuthenticationFilter(authenticationManager(), cache)); } diff --git a/buyer-api/src/test/java/cn/lili/buyer/test/cart/CartTest.java b/buyer-api/src/test/java/cn/lili/buyer/test/cart/CartTest.java index 1cc333be..59f9a435 100644 --- a/buyer-api/src/test/java/cn/lili/buyer/test/cart/CartTest.java +++ b/buyer-api/src/test/java/cn/lili/buyer/test/cart/CartTest.java @@ -50,9 +50,9 @@ class CartTest { @Test void createTrade() { -// TradeDTO allTradeDTO = cartService.getAllTradeDTO(); -// Assert.assertNotNull(allTradeDTO); -// System.out.println(JsonUtil.objectToJson(allTradeDTO)); +// TradeDTO allTradeDTO = cartService.getAllTradeDTO(); +// Assert.assertNotNull(allTradeDTO); +// System.out.println(JsonUtil.objectToJson(allTradeDTO)); cartService.createTrade(new TradeParams()); } diff --git a/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java b/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java index 8076a648..4003ad5a 100644 --- a/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java +++ b/buyer-api/src/test/java/cn/lili/buyer/test/cart/FileTest.java @@ -42,7 +42,7 @@ class FileTest { } URL url = new URL(brand.getLogo()); InputStream inputStream = url.openStream(); - // 上传至第三方云服务或服务器 + //上传至第三方云服务或服务器 brand.setLogo(fileManagerPlugin.inputStreamUpload(inputStream, brand.getId() + ".png")); } catch (IOException e) { log.error("上传你文件出错",e); diff --git a/common-api/src/main/java/cn/lili/controller/common/UploadController.java b/common-api/src/main/java/cn/lili/controller/common/UploadController.java index 7f6d05cd..d2e84495 100644 --- a/common-api/src/main/java/cn/lili/controller/common/UploadController.java +++ b/common-api/src/main/java/cn/lili/controller/common/UploadController.java @@ -73,7 +73,7 @@ public class UploadController { } if (StringUtils.isNotBlank(base64)) { - // base64上传 + //base64上传 file = Base64DecodeMultipartFile.base64Convert(base64); } String result = ""; @@ -81,9 +81,9 @@ public class UploadController { File newFile = new File(); try { InputStream inputStream = file.getInputStream(); - // 上传至第三方云服务或服务器 + //上传至第三方云服务或服务器 result = fileManagerPlugin.inputStreamUpload(inputStream, fileKey); - // 保存数据信息至数据库 + //保存数据信息至数据库 newFile.setName(file.getOriginalFilename()); newFile.setFileSize(file.getSize()); newFile.setFileType(file.getContentType()); diff --git a/common-api/src/main/java/cn/lili/controller/security/CommonSecurityConfig.java b/common-api/src/main/java/cn/lili/controller/security/CommonSecurityConfig.java index 15ba8a7c..a3cd9e4c 100644 --- a/common-api/src/main/java/cn/lili/controller/security/CommonSecurityConfig.java +++ b/common-api/src/main/java/cn/lili/controller/security/CommonSecurityConfig.java @@ -48,18 +48,18 @@ public class CommonSecurityConfig extends WebSecurityConfigurerAdapter { .authorizeRequests(); registry .and() - // 禁止网页iframe + //禁止网页iframe .headers().frameOptions().disable() .and() .authorizeRequests() - // 任何请求 + //任何请求 .anyRequest() - // 需要身份认证 + //需要身份认证 .permitAll() .and() - // 允许跨域 + //允许跨域 .cors().configurationSource(corsConfigurationSource).and() - // 关闭跨站请求防护 + //关闭跨站请求防护 .csrf().disable(); } diff --git a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java index c8449df3..7c54b374 100644 --- a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java @@ -161,7 +161,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { //促销库存key 集合 List promotionKey = new ArrayList<>(); - // 循环订单 + //循环订单 for (OrderItem orderItem : order.getOrderItems()) { skuKeys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); GoodsSku goodsSku = new GoodsSku(); @@ -221,7 +221,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { List goodsSkus = new ArrayList<>(); //sku库存key 集合 List skuKeys = new ArrayList<>(); - // 循环订单 + //循环订单 for (OrderItem orderItem : order.getOrderItems()) { skuKeys.add(GoodsSkuService.getStockCacheKey(orderItem.getSkuId())); GoodsSku goodsSku = new GoodsSku(); diff --git a/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java b/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java index f02719b8..fa4132d0 100644 --- a/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/GoodsMessageListener.java @@ -112,7 +112,7 @@ public class GoodsMessageListener implements RocketMQListener { for (GoodsCompleteMessage goodsCompleteMessage : goodsCompleteMessageList) { Goods goods = goodsService.getById(goodsCompleteMessage.getGoodsId()); if (goods != null) { - // 更新商品购买数量 + //更新商品购买数量 if (goods.getBuyCount() == null) { goods.setBuyCount(0); } @@ -126,7 +126,7 @@ public class GoodsMessageListener implements RocketMQListener { } GoodsSku goodsSku = goodsSkuService.getById(goodsCompleteMessage.getSkuId()); if (goodsSku != null) { - // 更新商品购买数量 + //更新商品购买数量 if (goodsSku.getBuyCount() == null) { goodsSku.setBuyCount(0); } diff --git a/consumer/src/main/java/cn/lili/listener/OrderMessageListener.java b/consumer/src/main/java/cn/lili/listener/OrderMessageListener.java index 02371a0d..892139e5 100644 --- a/consumer/src/main/java/cn/lili/listener/OrderMessageListener.java +++ b/consumer/src/main/java/cn/lili/listener/OrderMessageListener.java @@ -44,6 +44,7 @@ public class OrderMessageListener implements RocketMQListener { case ORDER_CREATE: String key = new String(messageExt.getBody()); TradeDTO tradeDTO = (TradeDTO) cache.get(key); + boolean result = true; for (TradeEvent event : tradeEvent) { try { event.orderCreate(tradeDTO); @@ -52,8 +53,14 @@ public class OrderMessageListener implements RocketMQListener { tradeDTO.getSn(), event.getClass().getName(), e); + result = false; } } + //如所有步骤顺利完成 + if (Boolean.TRUE.equals(result)) { + //清除记录信息的trade cache key + cache.remove(key); + } break; //订单状态变更 case STATUS_CHANGE: diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java index 82e5262a..1202c425 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/CancelOrderTaskExecute.java @@ -43,11 +43,11 @@ public class CancelOrderTaskExecute implements EveryMinuteExecute { Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name()); OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class); if (orderSetting != null && orderSetting.getAutoCancel() != null) { - // 订单自动取消时间 = 当前时间 - 自动取消时间分钟数 + //订单自动取消时间 = 当前时间 - 自动取消时间分钟数 DateTime cancelTime = DateUtil.offsetMinute(DateUtil.date(), -orderSetting.getAutoCancel()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.UNPAID.name()); - // 订单创建时间 <= 订单自动取消时间 + //订单创建时间 <= 订单自动取消时间 queryWrapper.le(Order::getCreateTime, cancelTime); List list = orderService.list(queryWrapper); List cancelSnList = list.stream().map(Order::getSn).collect(Collectors.toList()); diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java index 784dee61..223489e3 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/order/OrderEveryDayTaskExecute.java @@ -73,11 +73,11 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute { * @param orderSetting 订单设置 */ private void completedOrder(OrderSetting orderSetting) { - // 订单自动收货时间 = 当前时间 - 自动收货时间天数 + //订单自动收货时间 = 当前时间 - 自动收货时间天数 DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoEvaluation()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.DELIVERED.name()); - // 订单发货时间 >= 订单自动收货时间 + //订单发货时间 >= 订单自动收货时间 queryWrapper.ge(Order::getLogisticsTime, receiveTime); List list = orderService.list(queryWrapper); List receiveSnList = list.stream().map(Order::getSn).collect(Collectors.toList()); @@ -98,9 +98,9 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute { * @param orderSetting 订单设置 */ private void memberEvaluation(OrderSetting orderSetting) { - // 订单自动收货时间 = 当前时间 - 自动收货时间天数 + //订单自动收货时间 = 当前时间 - 自动收货时间天数 DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoReceive()); - // 订单完成时间 <= 订单自动好评时间 + //订单完成时间 <= 订单自动好评时间 List orderItems = orderItemService.waitEvaluate(receiveTime); for (OrderItem orderItem : orderItems) { diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java index b8f6686c..eb43758d 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java @@ -61,7 +61,7 @@ public class PromotionEverydayExecute implements EveryDayExecute { @Autowired private PromotionGoodsService promotionGoodsService; - // 系统设置 + //系统设置 @Autowired private SettingService settingService; @@ -108,7 +108,7 @@ public class PromotionEverydayExecute implements EveryDayExecute { List couponVOS = mongoTemplate.find(query, CouponVO.class); if (!couponVOS.isEmpty()) { List ids = new ArrayList<>(); - // // 关闭的优惠券活动 + // //关闭的优惠券活动 for (CouponVO vo : couponVOS) { vo.setPromotionStatus(PromotionStatusEnum.END.name()); if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) { diff --git a/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java b/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java index 6c539183..d76fcdaa 100644 --- a/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java +++ b/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java @@ -31,23 +31,23 @@ public abstract class AbstractDelayQueueListen { private void startDelayQueueMachine() { log.info("延时队列机器{}开始运作", setDelayQueueName()); - // 监听redis队列 + //监听redis队列 while (true) { try { - // 获取当前时间的时间戳 + //获取当前时间的时间戳 long now = System.currentTimeMillis() / 1000; - // 获取当前时间前需要执行的任务列表 + //获取当前时间前需要执行的任务列表 Set tuples = cache.zRangeByScore(setDelayQueueName(), 0, now); - // 如果任务不为空 + //如果任务不为空 if (!CollectionUtils.isEmpty(tuples)) { log.info("执行任务:{}", JSONUtil.toJsonStr(tuples)); for (DefaultTypedTuple tuple : tuples) { String jobId = (String) tuple.getValue(); - // 移除缓存,如果移除成功则表示当前线程处理了延时任务,则执行延时任务 + //移除缓存,如果移除成功则表示当前线程处理了延时任务,则执行延时任务 Long num = cache.zRemove(setDelayQueueName(), jobId); - // 如果移除成功, 则执行 + //如果移除成功, 则执行 if (num > 0) { ThreadPoolUtil.execute(() -> invoke(jobId)); } @@ -57,7 +57,7 @@ public abstract class AbstractDelayQueueListen { } catch (Exception e) { log.error("处理延时任务发生异常,异常原因为{}", e.getMessage(), e); } finally { - // 间隔一秒钟搞一次 + //间隔一秒钟搞一次 try { TimeUnit.SECONDS.sleep(5L); } catch (InterruptedException e) { diff --git a/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java index ab42b58b..d6088916 100644 --- a/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java +++ b/consumer/src/main/java/cn/lili/trigger/executor/BroadcastTimeTriggerExecutor.java @@ -29,7 +29,7 @@ public class BroadcastTimeTriggerExecutor implements TimeTriggerExecutor { BroadcastMessage broadcastMessage = JSONUtil.toBean(JSONUtil.parseObj(object), BroadcastMessage.class); if (broadcastMessage != null && broadcastMessage.getStudioId() != null) { log.info("直播间消费:{}", broadcastMessage); - // 修改直播间状态 + //修改直播间状态 studioService.updateStudioStatus(broadcastMessage); } } diff --git a/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java index 211c9bde..5abd9433 100644 --- a/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java +++ b/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java @@ -42,19 +42,19 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor { @Override public void execute(Object object) { PromotionMessage promotionMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PromotionMessage.class); - // 促销延时信息 + //促销延时信息 if (promotionMessage != null && promotionMessage.getPromotionId() != null) { log.info("促销活动信息消费:{}", promotionMessage); - // 如果为促销活动开始,则需要发布促销活动结束的定时任务 + //如果为促销活动开始,则需要发布促销活动结束的定时任务 if (PromotionStatusEnum.START.name().equals(promotionMessage.getPromotionStatus())) { if (!promotionService.updatePromotionStatus(promotionMessage)) { log.error("开始促销活动失败: {}", promotionMessage); return; } - // 促销活动开始后,设置促销活动结束的定时任务 + //促销活动开始后,设置促销活动结束的定时任务 promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name()); String uniqueKey = "{TIME_TRIGGER_" + promotionMessage.getPromotionType() + "}_" + promotionMessage.getPromotionId(); - // 结束时间(延时一分钟) + //结束时间(延时一分钟) long closeTime = promotionMessage.getEndTime().getTime() + 60000; TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic()); //添加延时任务 @@ -69,7 +69,7 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor { PintuanOrderMessage pintuanOrderMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PintuanOrderMessage.class); if (pintuanOrderMessage != null && pintuanOrderMessage.getPintuanId() != null) { log.info("拼团订单信息消费:{}", pintuanOrderMessage); - // 拼团订单自动处理 + //拼团订单自动处理 orderService.agglomeratePintuanOrder(pintuanOrderMessage.getPintuanId(), pintuanOrderMessage.getOrderSn()); } } diff --git a/framework/src/main/java/cn/lili/base/mybatisplus/MybatisPlusConfig.java b/framework/src/main/java/cn/lili/base/mybatisplus/MybatisPlusConfig.java index 1e077800..7407971c 100644 --- a/framework/src/main/java/cn/lili/base/mybatisplus/MybatisPlusConfig.java +++ b/framework/src/main/java/cn/lili/base/mybatisplus/MybatisPlusConfig.java @@ -20,12 +20,12 @@ public class MybatisPlusConfig { return new PaginationInterceptor(); //阻断解析器,测试环境使用 -// PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); +// PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // -// List sqlParserList = new ArrayList<>(); -// // 攻击 SQL 阻断解析器、加入解析链 -// sqlParserList.add(new BlockAttackSqlParser()); -// paginationInterceptor.setSqlParserList(sqlParserList); -// return paginationInterceptor; +// List sqlParserList = new ArrayList<>(); +// //攻击 SQL 阻断解析器、加入解析链 +// sqlParserList.add(new BlockAttackSqlParser()); +// paginationInterceptor.setSqlParserList(sqlParserList); +// return paginationInterceptor; } } diff --git a/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java b/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java index 0e35a46a..fd779456 100644 --- a/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java +++ b/framework/src/main/java/cn/lili/common/aop/limiter/LimitInterceptor.java @@ -1,6 +1,7 @@ package cn.lili.common.aop.limiter; import cn.lili.common.aop.limiter.annotation.LimitPoint; +import cn.lili.common.exception.ServiceException; import com.google.common.collect.ImmutableList; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -21,6 +22,7 @@ import java.lang.reflect.Method; /** * 流量拦截 + * * @author Chopper */ @Aspect @@ -42,7 +44,7 @@ public class LimitInterceptor { } @Around("execution(public * *(..)) && @annotation(cn.lili.common.aop.limiter.annotation.LimitPoint)") - public Object interceptor(ProceedingJoinPoint pjp) { + public Object interceptor(ProceedingJoinPoint pjp) throws Throwable { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); LimitPoint limitPointAnnotation = method.getAnnotation(LimitPoint.class); @@ -65,22 +67,26 @@ public class LimitInterceptor { try { Number count = redisTemplate.execute(limitScript, keys, limitCount, limitPeriod); log.info("Access try count is {} for name={} and key = {}", count, name, key); - if (count != null && count.intValue() <= limitCount) { + //如果缓存里没有值,或者他的值小于限制频率 + if (count.intValue() <= limitCount) { return pjp.proceed(); } else { - throw new RuntimeException("访问过于频繁,请稍后再试"); - } - } catch (Throwable e) { - if (e instanceof RuntimeException) { - throw new RuntimeException(e.getLocalizedMessage()); + throw new ServiceException("访问过于频繁,请稍后再试"); } + } + //如果从redis中执行都值判定为空,则这里跳过 + catch (NullPointerException e) { + return pjp.proceed(); + } catch (Exception e) { throw new RuntimeException("服务器异常,请稍后再试"); } } + //默认unknown常量值 private static final String UNKNOWN = "unknown"; + //获取ip public String getIpAddress() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String ip = request.getHeader("x-forwarded-for"); diff --git a/framework/src/main/java/cn/lili/common/aop/syslog/interceptor/SystemLogAspect.java b/framework/src/main/java/cn/lili/common/aop/syslog/interceptor/SystemLogAspect.java index 1009fa09..ea814963 100644 --- a/framework/src/main/java/cn/lili/common/aop/syslog/interceptor/SystemLogAspect.java +++ b/framework/src/main/java/cn/lili/common/aop/syslog/interceptor/SystemLogAspect.java @@ -102,7 +102,7 @@ public class SystemLogAspect { //请求参数 systemLogVO.setMapToParams(logParams); //响应参数 此处数据太大了,所以先注释掉 -// systemLogVO.setResponseBody(JSONUtil.toJsonStr(rvt)); +// systemLogVO.setResponseBody(JSONUtil.toJsonStr(rvt)); //请求IP systemLogVO.setIp(IpUtils.getIpAddress(request)); //IP地址 diff --git a/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java b/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java index cc21e89b..85ca4838 100644 --- a/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java +++ b/framework/src/main/java/cn/lili/common/cache/impl/RedisCache.java @@ -170,7 +170,7 @@ public class RedisCache implements Cache { @Override public Long cumulative(Object key, Object value) { HyperLogLogOperations operations = redisTemplate.opsForHyperLogLog(); - // add 方法对应 PFADD 命令 + //add 方法对应 PFADD 命令 return operations.add(key, value); } @@ -179,7 +179,7 @@ public class RedisCache implements Cache { public Long counter(Object key) { HyperLogLogOperations operations = redisTemplate.opsForHyperLogLog(); - // add 方法对应 PFADD 命令 + //add 方法对应 PFADD 命令 return operations.size(key); } @@ -198,7 +198,7 @@ public class RedisCache implements Cache { @Override public Long mergeCounter(Object... key) { HyperLogLogOperations operations = redisTemplate.opsForHyperLogLog(); - // 计数器合并累加 + //计数器合并累加 return operations.union(key[0], key); } @@ -223,7 +223,7 @@ public class RedisCache implements Cache { */ @Override public void incrementScore(String sortedSetName, String keyword) { - // x 的含义请见本方法的注释 + //x 的含义请见本方法的注释 double x = 1.0; this.redisTemplate.opsForZSet().incrementScore(sortedSetName, keyword, x); } diff --git a/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java b/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java index a257a2ba..b5cbfe4e 100644 --- a/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java +++ b/framework/src/main/java/cn/lili/common/elasticsearch/BaseElasticsearchService.java @@ -44,7 +44,7 @@ public abstract class BaseElasticsearchService { static { RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); - // 默认缓冲限制为100MB,此处修改为30MB。 + //默认缓冲限制为100MB,此处修改为30MB。 builder.setHttpAsyncResponseConsumerFactory(new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024)); COMMON_OPTIONS = builder.build(); } @@ -88,7 +88,7 @@ public abstract class BaseElasticsearchService { protected void createIndexRequest(String index) { try { CreateIndexRequest request = new CreateIndexRequest(index); - // Settings for this index + //Settings for this index request.settings(Settings.builder().put("index.number_of_shards", elasticsearchProperties.getIndex().getNumberOfShards()).put("index.number_of_replicas", elasticsearchProperties.getIndex().getNumberOfReplicas())); //创建索引 @@ -308,13 +308,13 @@ public abstract class BaseElasticsearchService { PutMappingRequest request = new PutMappingRequest(index) .source(source, XContentType.JSON); -// AcknowledgedResponse putMappingResponse = client.indices().putMapping(request, -// RequestOptions.DEFAULT); +// AcknowledgedResponse putMappingResponse = client.indices().putMapping(request, +// RequestOptions.DEFAULT); // -// boolean acknowledged = putMappingResponse.isAcknowledged(); -// if (acknowledged) { -// log.error("Succeed to put mapping"); -// } +// boolean acknowledged = putMappingResponse.isAcknowledged(); +// if (acknowledged) { +// log.error("Succeed to put mapping"); +// } CountDownLatch latch = new CountDownLatch(1); AtomicReference response = new AtomicReference(); client.indices().putMappingAsync( diff --git a/framework/src/main/java/cn/lili/common/enums/ResultCode.java b/framework/src/main/java/cn/lili/common/enums/ResultCode.java index 90fd8a16..d6e4b16b 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -97,8 +97,8 @@ public enum ResultCode { USER_RECEIPT_NOT_EXIST(20014, "会员发票信息不存在"), USER_EDIT_ERROR(20015, "用户修改失败"), USER_OLD_PASSWORD_ERROR(20016, "旧密码不正确"), - USER_COLLECTION_EXIST(20017,"无法重复收藏"), - USER_GRADE_IS_DEFAULT(20018,"会员等级为默认会员等级"), + USER_COLLECTION_EXIST(20017, "无法重复收藏"), + USER_GRADE_IS_DEFAULT(20018, "会员等级为默认会员等级"), DELETE_EXIST(2001, "无法重复收藏"), /** @@ -125,62 +125,97 @@ public enum ResultCode { * 购物车 */ CART_ERROR(30001, "读取结算页的购物车异常"), + CART_PINTUAN_NOT_EXIST_ERROR(30002, "拼团活动不存在错误"), + CART_PINTUAN_LIMIT_ERROR(30003, "购买数量超过拼团活动限制数量"), SHIPPING_NOT_APPLY(30005, "购物商品不支持当前收货地址配送"), + /** * 订单 */ ORDER_ERROR(31001, "创建订单异常,请稍后重试"), + ORDER_NOT_EXIST(31002, "订单不存在"), + ORDER_DELIVERED_ERROR(31003, "订单状态错误,无法进行确认收货"), + ORDER_UPDATE_PRICE_ERROR(31004, "已支付的订单不能修改金额"), + ORDER_LOGISTICS_ERROR(31005, "物流错误"), + ORDER_DELIVER_ERROR(31006, "物流错误"), + ORDER_NOT_USER(31007, "非当前会员的订单"), + ORDER_TAKE_ERROR(31008, "当前订单无法核销"), + MEMBER_ADDRESS_NOT_EXIST(31009, "订单无收货地址,请先配置收货地址"), + ORDER_DELIVER_NUM_ERROR(31010, "没有待发货的订单"), /** * 支付 */ PAY_UN_WANTED(32000, "当前订单不需要付款,返回订单列表等待系统订单出库即可"), + PAY_SUCCESS(32001, "支付成功"), + PAY_INCONSISTENT_ERROR(32002, "付款金额和应付金额不一致"), + PAY_DOUBLE_ERROR(32003, "订单已支付,不能再次进行支付"), + PAY_CASHIER_ERROR(32004, "收银台信息获取错误"), + PAY_ERROR(32005, "支付业务异常,请稍后重试"), + PAY_BAN(32006, "当前订单不需要付款,请返回订单列表重新操作"), + PAY_PARTIAL_ERROR(32007, "该订单已部分支付,请前往订单中心进行支付"), + PAY_NOT_SUPPORT(32008, "支付暂不支持"), + PAY_CLIENT_TYPE_ERROR(32009, "错误的客户端"), + PAY_POINT_ENOUGH(32010, "积分不足,不能兑换"), + PAY_NOT_EXIST_ORDER(32011, "支付订单不存在"), /** * 售后 */ AFTER_SALES_NOT_PAY_ERROR(33001, "当前订单未支付,不能申请售后"), + AFTER_SALES_CANCEL_ERROR(33002, "当前售后单无法取消"), + AFTER_SALES_BAN(33003, "订单状态不允许申请售后,请联系平台或商家"), + AFTER_SALES_DOUBLE_ERROR(33004, "售后已审核,无法重复操作"), + AFTER_SALES_LOGISTICS_ERROR(33005, "物流公司错误,请重新选择"), + AFTER_STATUS_ERROR(33006, "售后状态错误,请刷新页面"), /** * 投诉 */ COMPLAINT_ORDER_ITEM_EMPTY_ERROR(33100, "订单不存在"), + COMPLAINT_SKU_EMPTY_ERROR(33101, "商品已下架,如需投诉请联系平台客服"), + COMPLAINT_ERROR(33102, "投诉异常,请稍后重试"), /** * 余额 */ WALLET_NOT_EXIT_ERROR(34000, "钱包不存在,请联系管理员"), + WALLET_INSUFFICIENT(34001, "余额不足以支付订单,请充值!"), + WALLET_WITHDRAWAL_INSUFFICIENT(34002, "可提现金额不足!"), + WALLET_ERROR_INSUFFICIENT(34003, "零钱提现失败!"), + WALLET_REMARK_ERROR(34004, "请填写审核备注!"), + WALLET_APPLY_ERROR(34005, "提现申请异常!"), /** @@ -197,52 +232,74 @@ public enum ResultCode { * 优惠券 */ COUPON_EDIT_STATUS_SUCCESS(41001, "修改状态成功!"), + COUPON_CANCELLATION_SUCCESS(41002, "会员优惠券作废成功"), + COUPON_EXPIRED(41003, "优惠券已使用/已过期,不能使用"), + COUPON_EDIT_STATUS_ERROR(41004, "优惠券修改状态失败!"), /** * 拼团 */ PINTUAN_MANUAL_OPEN_SUCCESS(42001, "手动开启拼团活动成功"), + PINTUAN_MANUAL_CLOSE_SUCCESS(42002, "手动关闭拼团活动成功"), + PINTUAN_ADD_SUCCESS(42003, "添加拼团活动成功"), + PINTUAN_EDIT_SUCCESS(42004, "修改拼团活动成功"), + PINTUAN_DELETE_SUCCESS(42005, "删除拼团活动成功"), + PINTUAN_MANUAL_OPEN_ERROR(42006, "手动开启拼团活动失败"), + PINTUAN_MANUAL_CLOSE_ERROR(42007, "手动关闭拼团活动失败"), + PINTUAN_ADD_ERROR(42008, "添加拼团活动失败"), + PINTUAN_EDIT_ERROR(42009, "修改拼团活动失败"), + PINTUAN_DELETE_ERROR(42010, "删除拼团活动失败"), /** * 满额活动 */ FULL_DISCOUNT_EDIT_SUCCESS(43001, "修改满优惠活动成功"), + FULL_DISCOUNT_EDIT_DELETE(43002, "删除满优惠活动成功"), /** * 店铺 */ STORE_NOT_EXIST(50001, "此店铺不存在"), + STORE_NAME_EXIST_ERROR(50002, "店铺名称已存在!"), + STORE_APPLY_DOUBLE_ERROR(50003, "已有店铺,无需重复申请!"), /** * 结算单 */ BILL_CHECK_ERROR(51001, "只有已出账结算单可以核对"), + BILL_COMPLETE_ERROR(51002, "只有已审核结算单可以支付"), /** * 文章 */ ARTICLE_CATEGORY_NAME_EXIST(60001, "文章分类名称已存在"), + ARTICLE_CATEGORY_PARENT_NOT_EXIST(60002, "文章分类父分类不存在"), + ARTICLE_CATEGORY_BEYOND_TWO(60003, "最多为二级分类,操作失败"), + ARTICLE_CATEGORY_DELETE_ERROR(60004, "该文章分类下存在子分类,不能删除"), + ARTICLE_CATEGORY_HAS_ARTICLE(60005, "该文章分类下存在文章,不能删除"), + ARTICLE_CATEGORY_NO_DELETION(60007, "默认文章分类不能进行删除"), + ARTICLE_NO_DELETION(60008, "默认文章不能进行删除"), @@ -250,8 +307,11 @@ public enum ResultCode { * 页面 */ PAGE_NOT_EXIST(61001, "页面不存在"), + PAGE_OPEN_DELETE_ERROR(61002, "当前页面为开启状态,无法删除"), + PAGE_DELETE_ERROR(61003, "当前页面为唯一页面,无法删除"), + PAGE_RELEASE_ERROR(61004, "页面已发布,无需重复提交"), /** @@ -268,39 +328,49 @@ public enum ResultCode { * 站内信 */ NOTICE_NOT_EXIST(80101, "当前消息模板不存在"), + NOTICE_ERROR(80102, "修改站内信异常,请稍后重试"), /** * OSS */ OSS_NOT_EXIST(80201, "OSS未配置"), + OSS_EXCEPTION(80202, "文件上传失败,请稍后重试"), /** * 验证码 */ VERIFICATION_SEND_SUCCESS(80301, "短信验证码,发送成功"), + VERIFICATION_ERROR(80302, "验证失败"), + VERIFICATION_SMS_ERROR(80303, "短信验证码错误,请重新校验"), + VERIFICATION_SMS_EXPIRED_ERROR(80304, "验证码已失效,请重新校验"), /** * 配置错误 */ ALIPAY_NOT_SETTING(80401, "支付宝支付未配置"), + ALIPAY_EXCEPTION(80402, "支付宝支付错误,请稍后重试"), + ALIPAY_PARAMS_EXCEPTION(80403, "支付宝参数异常"), /** * 微信相关异常 */ WECHAT_CONNECT_NOT_SETTING(80500, "微信联合登陆信息未配置"), + WECHAT_PAYMENT_NOT_SETTING(80501, "微信支付信息未配置"), + WECHAT_QRCODE_ERROR(80502, "微信二维码生成异常"), + WECHAT_MP_MESSAGE_ERROR(80503, "微信小程序小消息订阅异常"), - APP_VERSION_EXIST(80600, "APP版本已存在") - ; + APP_VERSION_EXIST(80600, "APP版本已存在"); + private final Integer code; private final String message; diff --git a/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java b/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java index abac16d0..09f4838f 100644 --- a/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java +++ b/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java @@ -67,24 +67,24 @@ public class GlobalControllerExceptionHandler { return ResultUtil.error(ResultCode.ERROR); } -// /** -// * 通用的接口映射异常处理方 -// */ -// @Override -// protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { -// if (ex instanceof MethodArgumentNotValidException) { -// MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex; -// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status); -// } -// if (ex instanceof MethodArgumentTypeMismatchException) { -// MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex; -// logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName() -// + ",信息:" + exception.getLocalizedMessage()); -// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg("参数转换失败"), status); -// } -// ex.printStackTrace(); -// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg("未知异常,请联系管理员"), status); -// } +// /** +// * 通用的接口映射异常处理方 +// */ +// @Override +// protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { +// if (ex instanceof MethodArgumentNotValidException) { +// MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex; +// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status); +// } +// if (ex instanceof MethodArgumentTypeMismatchException) { +// MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex; +// logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName() +// + ",信息:" + exception.getLocalizedMessage()); +// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg("参数转换失败"), status); +// } +// ex.printStackTrace(); +// return new ResponseEntity<>(new ResultUtil<>().setErrorMsg("未知异常,请联系管理员"), status); +// } /** * bean校验未通过异常 diff --git a/framework/src/main/java/cn/lili/common/security/filter/XssHttpServletRequestWrapper.java b/framework/src/main/java/cn/lili/common/security/filter/XssHttpServletRequestWrapper.java index 990bd0a6..cdc533e4 100644 --- a/framework/src/main/java/cn/lili/common/security/filter/XssHttpServletRequestWrapper.java +++ b/framework/src/main/java/cn/lili/common/security/filter/XssHttpServletRequestWrapper.java @@ -80,7 +80,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { * @return */ private String cleanXSS2(String value) { - // 移除特殊标签 + //移除特殊标签 value = value.replaceAll("<", "<").replaceAll(">", ">"); value = value.replaceAll("\\(", "(").replaceAll("\\)", ")"); value = value.replaceAll("'", "'"); @@ -93,40 +93,40 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { private String cleanXSS(String value) { if (value != null) { //推荐使用ESAPI库来避免脚本攻击,value = ESAPI.encoder().canonicalize(value); -// // 避免空字符串 -// value = value.replaceAll(" ", ""); - // 避免script 标签 +// //避免空字符串 +// value = value.replaceAll(" ", ""); + //避免script 标签 Pattern scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); - // 避免src形式的表达式 + //避免src形式的表达式 scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); - // 删除单个的 标签 + //删除单个的 标签 scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); - // 删除单个的