限制用户下单频率
This commit is contained in:
@@ -30,8 +30,6 @@ import com.sqx.modules.course.entity.CourseDetails;
|
|||||||
import com.sqx.modules.course.entity.CourseUser;
|
import com.sqx.modules.course.entity.CourseUser;
|
||||||
import com.sqx.modules.course.service.CourseDetailsService;
|
import com.sqx.modules.course.service.CourseDetailsService;
|
||||||
import com.sqx.modules.course.service.CourseUserService;
|
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.dao.OrdersDao;
|
||||||
import com.sqx.modules.orders.dto.SummaryDTO;
|
import com.sqx.modules.orders.dto.SummaryDTO;
|
||||||
import com.sqx.modules.orders.entity.Orders;
|
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.entity.PayDetails;
|
||||||
import com.sqx.modules.pay.service.DyService;
|
import com.sqx.modules.pay.service.DyService;
|
||||||
import com.sqx.modules.pay.service.WxService;
|
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.dao.SysUserDao;
|
||||||
import com.sqx.modules.sys.entity.SysUserEntity;
|
import com.sqx.modules.sys.entity.SysUserEntity;
|
||||||
import com.sqx.modules.utils.AliPayOrderUtil;
|
import com.sqx.modules.utils.AliPayOrderUtil;
|
||||||
@@ -88,10 +87,6 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> implements
|
|||||||
@Autowired
|
@Autowired
|
||||||
private UserService userService;
|
private UserService userService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private InviteService inviteService;
|
|
||||||
@Autowired
|
|
||||||
private InviteMoneyService inviteMoneyService;
|
|
||||||
@Autowired
|
|
||||||
private DyService dyService;
|
private DyService dyService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private CourseDetailsDao courseDetailsDao;
|
private CourseDetailsDao courseDetailsDao;
|
||||||
@@ -106,6 +101,9 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> implements
|
|||||||
@Autowired
|
@Autowired
|
||||||
private PayDetailsDao payDetailsDao;
|
private PayDetailsDao payDetailsDao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisService redisService;
|
||||||
|
|
||||||
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
|
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
|
||||||
|
|
||||||
|
|
||||||
@@ -262,6 +260,11 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersDao, Orders> implements
|
|||||||
@Override
|
@Override
|
||||||
public Result insertCourseOrders(Long courseId, Long courseDetailsId, Long userId) {
|
public Result insertCourseOrders(Long courseId, Long courseDetailsId, Long userId) {
|
||||||
log.info("生成商品订单信息接口入参为:{},{}", courseId, userId);
|
log.info("生成商品订单信息接口入参为:{},{}", courseId, userId);
|
||||||
|
|
||||||
|
if (!redisService.getUserCanCreateOrder(userId)) {
|
||||||
|
return Result.error("操作过于频繁,请稍后再试!");
|
||||||
|
}
|
||||||
|
redisService.setUserCanCreateOrder(userId);
|
||||||
UserEntity userEntity = userService.getById(userId);
|
UserEntity userEntity = userService.getById(userId);
|
||||||
if (userEntity == null) {
|
if (userEntity == null) {
|
||||||
throw new SqxException("用户不存在");
|
throw new SqxException("用户不存在");
|
||||||
|
|||||||
@@ -35,4 +35,16 @@ public interface RedisService {
|
|||||||
|
|
||||||
void removeCanCashFlag(Long userId);
|
void removeCanCashFlag(Long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置用户上次创建订单时间
|
||||||
|
* @param userId 用户id
|
||||||
|
*/
|
||||||
|
void setUserCanCreateOrder(Long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断用户是否可以创建订单 30s 内只能创建一次订单
|
||||||
|
* @param userId 用户id
|
||||||
|
*/
|
||||||
|
boolean getUserCanCreateOrder(Long userId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -361,4 +361,18 @@ public class RedisServiceImpl implements RedisService {
|
|||||||
Set<String> keys = redisTemplate.keys("createOrder:" + userId + ":*");
|
Set<String> keys = redisTemplate.keys("createOrder:" + userId + ":*");
|
||||||
return keys != null && keys.size() > 22;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
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.UserDao;
|
||||||
import com.sqx.modules.app.dao.UserMoneyDao;
|
import com.sqx.modules.app.dao.UserMoneyDao;
|
||||||
import com.sqx.modules.app.dao.UserMoneyDetailsDao;
|
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.dao.PayDetailsDao;
|
||||||
import com.sqx.modules.pay.entity.PayDetails;
|
import com.sqx.modules.pay.entity.PayDetails;
|
||||||
import com.sqx.modules.pay.service.PayDetailsService;
|
import com.sqx.modules.pay.service.PayDetailsService;
|
||||||
|
import com.sqx.modules.redisService.RedisService;
|
||||||
import com.sqx.modules.sys.service.SysUserService;
|
import com.sqx.modules.sys.service.SysUserService;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -42,7 +44,7 @@ import java.util.Set;
|
|||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ActiveProfiles("pay")
|
@ActiveProfiles("test")
|
||||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||||
public class Tets {
|
public class Tets {
|
||||||
private static final Logger log = LoggerFactory.getLogger(Tets.class);
|
private static final Logger log = LoggerFactory.getLogger(Tets.class);
|
||||||
@@ -74,6 +76,67 @@ public class Tets {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private OrdersService ordersService;
|
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
|
@Test
|
||||||
public void testOrder() {
|
public void testOrder() {
|
||||||
String orderNo = "70ae4e2707834bad8f06c9555dbf2528";
|
String orderNo = "70ae4e2707834bad8f06c9555dbf2528";
|
||||||
|
|||||||
Reference in New Issue
Block a user