限制用户下单频率

This commit is contained in:
GYJ
2025-03-04 15:20:52 +08:00
parent 6184818182
commit 0381fd4ab5
4 changed files with 99 additions and 7 deletions

View File

@@ -30,8 +30,6 @@ import com.sqx.modules.course.entity.CourseDetails;
import com.sqx.modules.course.entity.CourseUser;
import com.sqx.modules.course.service.CourseDetailsService;
import com.sqx.modules.course.service.CourseUserService;
import com.sqx.modules.invite.service.InviteMoneyService;
import com.sqx.modules.invite.service.InviteService;
import com.sqx.modules.orders.dao.OrdersDao;
import com.sqx.modules.orders.dto.SummaryDTO;
import com.sqx.modules.orders.entity.Orders;
@@ -43,6 +41,7 @@ import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.entity.PayDetails;
import com.sqx.modules.pay.service.DyService;
import com.sqx.modules.pay.service.WxService;
import com.sqx.modules.redisService.RedisService;
import com.sqx.modules.sys.dao.SysUserDao;
import com.sqx.modules.sys.entity.SysUserEntity;
import com.sqx.modules.utils.AliPayOrderUtil;
@@ -88,10 +87,6 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> implements
@Autowired
private UserService userService;
@Autowired
private InviteService inviteService;
@Autowired
private InviteMoneyService inviteMoneyService;
@Autowired
private DyService dyService;
@Autowired
private CourseDetailsDao courseDetailsDao;
@@ -106,6 +101,9 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> implements
@Autowired
private PayDetailsDao payDetailsDao;
@Autowired
private RedisService redisService;
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
@@ -262,6 +260,11 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> implements
@Override
public Result insertCourseOrders(Long courseId, Long courseDetailsId, Long userId) {
log.info("生成商品订单信息接口入参为:{},{}", courseId, userId);
if (!redisService.getUserCanCreateOrder(userId)) {
return Result.error("操作过于频繁,请稍后再试!");
}
redisService.setUserCanCreateOrder(userId);
UserEntity userEntity = userService.getById(userId);
if (userEntity == null) {
throw new SqxException("用户不存在");

View File

@@ -35,4 +35,16 @@ public interface RedisService {
void removeCanCashFlag(Long userId);
/**
* 设置用户上次创建订单时间
* @param userId 用户id
*/
void setUserCanCreateOrder(Long userId);
/**
* 判断用户是否可以创建订单 30s 内只能创建一次订单
* @param userId 用户id
*/
boolean getUserCanCreateOrder(Long userId);
}

View File

@@ -361,4 +361,18 @@ public class RedisServiceImpl implements RedisService {
Set<String> keys = redisTemplate.keys("createOrder:" + userId + ":*");
return keys != null && keys.size() > 22;
}
@Override
public void setUserCanCreateOrder(Long userId) {
String key = "user:canCreateOrder:" + userId;
redisTemplate.opsForValue().set(key, "1", 30, TimeUnit.SECONDS);
}
@Override
public boolean getUserCanCreateOrder(Long userId) {
String key = "user:canCreateOrder:" + userId;
String s = redisTemplate.opsForValue().get(key);
return StrUtil.isBlank(s);
}
}

View File

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sqx.common.utils.Result;
import com.sqx.modules.app.dao.UserDao;
import com.sqx.modules.app.dao.UserMoneyDao;
import com.sqx.modules.app.dao.UserMoneyDetailsDao;
@@ -25,6 +26,7 @@ import com.sqx.modules.pay.dao.CashOutDao;
import com.sqx.modules.pay.dao.PayDetailsDao;
import com.sqx.modules.pay.entity.PayDetails;
import com.sqx.modules.pay.service.PayDetailsService;
import com.sqx.modules.redisService.RedisService;
import com.sqx.modules.sys.service.SysUserService;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
@@ -42,7 +44,7 @@ import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@ActiveProfiles("pay")
@ActiveProfiles("test")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Tets {
private static final Logger log = LoggerFactory.getLogger(Tets.class);
@@ -74,6 +76,67 @@ public class Tets {
@Autowired
private OrdersService ordersService;
@Autowired
private RedisService redisService;
@Test
public void testRedis2() {
Result result = ordersService.insertCourseOrders(1L, 1L, 22L);
System.out.println(result);
try {
Thread.sleep(3 * 1000);
result = ordersService.insertCourseOrders(1L, 1L, 22L);
System.out.println(result);
Thread.sleep(30 * 1000);
result = ordersService.insertCourseOrders(1L, 1L, 22L);
System.out.println(result);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
@Test
public void testRedis() {
Long userId = 1221L;
boolean createOrder = redisService.getUserCanCreateOrder(userId);
System.out.println(createOrder);
if (!createOrder) {
System.out.println("用户不能创建订单");
} else {
System.out.println("用户可以创建订单");
}
redisService.setUserCanCreateOrder(userId);
createOrder = redisService.getUserCanCreateOrder(userId);
System.out.println(createOrder);
if (!createOrder) {
System.out.println("用户不能创建订单");
} else {
System.out.println("用户可以创建订单");
}
try {
Thread.sleep(31 * 1000);
createOrder = redisService.getUserCanCreateOrder(userId);
System.out.println(createOrder);
if (!createOrder) {
System.out.println("用户不能创建订单");
} else {
System.out.println("用户可以创建订单");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
@Test
public void testOrder() {
String orderNo = "70ae4e2707834bad8f06c9555dbf2528";