|
|
@@ -3,7 +3,6 @@ package com.cyksj.web.controller.user;
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
-import cn.hutool.core.util.URLUtil;
|
|
|
import cn.hutool.extra.servlet.ServletUtil;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.cyksj.common.annotation.NoSubmit;
|
|
|
@@ -14,6 +13,7 @@ import com.cyksj.enums.GatewayApiCode;
|
|
|
import com.cyksj.enums.GatewayResponse;
|
|
|
import com.cyksj.mapper.*;
|
|
|
import com.cyksj.mapper.manage.coupon.CouponUserMapper;
|
|
|
+import com.cyksj.mapper.manage.exchange.ExchangeCodeMapper;
|
|
|
import com.cyksj.mapper.manage.distribute.*;
|
|
|
import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
|
|
|
import com.cyksj.model.dto.UserWhoami;
|
|
|
@@ -62,6 +62,8 @@ public class UserController {
|
|
|
|
|
|
private final ExchangeCodeService exchangeCodeService;
|
|
|
|
|
|
+ private final ExchangeCodeMapper exchangeCodeMapper;
|
|
|
+
|
|
|
private final CouponUserMapper couponUserMapper;
|
|
|
|
|
|
private final OrderDonMapper orderDonMapper;
|
|
|
@@ -128,18 +130,28 @@ public class UserController {
|
|
|
* 车票兑换码详情
|
|
|
*/
|
|
|
@GetMapping("/get/ticket/code/detail")
|
|
|
- public Result<ExchangeCodeDetailView> getTicketCodeDetail(String code) throws Exception {
|
|
|
- if (StrUtil.isBlank(code) || code.length() > 256) {
|
|
|
+ public Result<ExchangeCodeDetailView> getTicketCodeDetail(
|
|
|
+ @RequestParam(value = "code", required = false) String code) throws Exception {
|
|
|
+ // Spring already decodes query parameters. Never decode a second time.
|
|
|
+ // Accept legacy underscore/hyphen codes, but reject whitespace and encoded payloads.
|
|
|
+ if (code == null || !code.matches("[A-Za-z0-9_-]{1,256}")) {
|
|
|
throw BusinessRuntimeException.getInstance("错误兑换码");
|
|
|
}
|
|
|
- code = URLUtil.decode(code);
|
|
|
- ExchangeCodeDetailView exchangeCodeDetailView = beanSearcher.searchFirst(ExchangeCodeDetailView.class, MapUtils.builder().field(ExchangeCodeDetailView::getCode, code).build());
|
|
|
- if (exchangeCodeDetailView == null) {
|
|
|
+ // Do not pass request parameters to BeanSearcher: all filters are server-owned.
|
|
|
+ ExchangeCode record = exchangeCodeMapper.selectOne(Wrappers.lambdaQuery(ExchangeCode.class)
|
|
|
+ .eq(ExchangeCode::getCode, code).last("LIMIT 1"));
|
|
|
+ // Also reject case-insensitive matches from a *_ci database collation.
|
|
|
+ if (record == null || !code.equals(record.getCode())) {
|
|
|
throw BusinessRuntimeException.getInstance("错误兑换码");
|
|
|
}
|
|
|
- List<Long> skuIds = Jsons.parseList(exchangeCodeDetailView.getSkuIds(), Long.class);
|
|
|
- exchangeCodeDetailView.setSkuDetails(skuMapper.selectExchangeTitleSkus(skuIds));
|
|
|
- return GatewayResponse.SUCCESS.newBuilder().toResult(exchangeCodeDetailView);
|
|
|
+ ExchangeCodeDetailView detail = new ExchangeCodeDetailView();
|
|
|
+ detail.setSkuIds(record.getSkuIds());
|
|
|
+ detail.setUseStatus(record.getUseStatus());
|
|
|
+ detail.setUseTime(record.getUseTime());
|
|
|
+ detail.setCodeType(record.getCodeType());
|
|
|
+ List<Long> skuIds = Jsons.parseList(record.getSkuIds(), Long.class);
|
|
|
+ detail.setSkuDetails(skuMapper.selectExchangeTitleSkus(skuIds));
|
|
|
+ return GatewayResponse.SUCCESS.newBuilder().toResult(detail);
|
|
|
}
|
|
|
|
|
|
/**
|