Commit 68962b2c by wqc

一天提交5次

parent 968e3bb2
......@@ -41,6 +41,9 @@ public interface UserFeign {
@PostMapping(value = "/api/prize/getLotteryRecList")
ResultVo getLotteryRecList(@RequestBody Map<String, Object> paramsMap);
@PostMapping(value = "/api/prize/getLuckyList")
ResultVo getLuckyList(@RequestBody Map<String, Object> paramsMap);
@PostMapping(value = "/api/address/getAddressList")
ResultVo getAddressList(@RequestBody Map<String, Object> paramsMap);
......
......@@ -66,6 +66,14 @@ public interface IApiLogic extends IApiCommon {
ApiResp getLotteryRecList(ApiForm form);
/**
* 中奖名单
*
* @param form
* @return
*/
ApiResp getLuckyList(ApiForm form);
/**
* 收货地址
*
* @param form
......
......@@ -59,6 +59,11 @@ public class ApiV100Logic extends BaseApiLogic implements IApiLogic {
return ApiUtils.toApiResp(form, userFeign.getLotteryRecList(form.getParamsMap(true)));
}
@Override
public ApiResp getLuckyList(ApiForm form) {
return ApiUtils.toApiResp(form, userFeign.getLuckyList(form.getParamsMap(true)));
}
/**
* 收货地址
*
......
......@@ -65,6 +65,19 @@
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!--Map依赖 -->
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
<version>0.5.10</version>
</dependency>
<!-- druid数据源驱动 -->
<dependency>
<groupId>com.alibaba</groupId>
......
......@@ -4,6 +4,7 @@ import com.zq.common.utils.AssertUtils;
import com.zq.common.vo.PageVo;
import com.zq.common.vo.ResultVo;
import com.zq.user.entity.LotteryRec;
import com.zq.user.entity.LuckyName;
import com.zq.user.entity.Prize;
import com.zq.user.entity.PrizeType;
import com.zq.user.service.PrizeService;
......@@ -53,4 +54,10 @@ public class PrizeApi {
return ResultVo.success(prizeService.getLotteryRecList(vo));
}
@ApiOperation("中奖名单")
@PostMapping(value = "/getLuckyList")
public ResultVo getLuckyList() {
return ResultVo.success(prizeService.getLuckyList());
}
}
package com.zq.user.controller.api;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.zq.common.utils.AssertUtils;
import com.zq.common.vo.ResultVo;
import com.zq.user.dao.AnswerRecDao;
import com.zq.user.dao.ReplyCountDao;
import com.zq.user.entity.AnswerRec;
import com.zq.user.entity.ReplyCount;
import com.zq.user.service.PrizeService;
import com.zq.user.service.QuestionService;
import com.zq.user.utils.LimitRequest;
import com.zq.user.vo.LotteryRecFindVo;
import com.zq.user.vo.QuestionFindVo;
import io.swagger.annotations.Api;
......@@ -12,6 +18,8 @@ import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author wilmiam
* @since 2022/6/15 9:51
......@@ -24,6 +32,7 @@ public class QuestionApi {
private final PrizeService prizeService;
private final QuestionService questionService;
private final ReplyCountDao replyCountDao;
@ApiOperation("获取题目列表")
@PostMapping(value = "/getQuestionList")
......@@ -32,10 +41,30 @@ public class QuestionApi {
}
@ApiOperation("答题")
// @LimitRequest(count=5)
@PostMapping(value = "/answer")
public ResultVo answer(@RequestBody AnswerRec vo) {
// AssertUtils.hasText(vo.getUserId(), "缺少用户ID");
AssertUtils.hasText(vo.getUserId(), "缺少用户ID");
AssertUtils.hasText(vo.getAnswerList(), "缺少答案");
ReplyCount replyCount2 = replyCountDao.selectOne(Wrappers.lambdaQuery(ReplyCount.builder().userId(vo.getUserId()).build()));
if (replyCount2==null) {
ReplyCount reply= new ReplyCount();
reply.setUserId(vo.getUserId());
reply.setReplyCount(vo.getReplyCount());
replyCountDao.insert(reply);
}
else{
Integer count = replyCount2.getReplyCount();
count+=count;
ReplyCount reply= new ReplyCount();
reply.setReplyCount(count);
replyCountDao.update(reply);
}
if (replyCount2.getReplyCount().intValue()>5){
return ResultVo.fail("今日已达5次题,请明日再答");
}
return ResultVo.success(questionService.answer(vo));
}
......
package com.zq.user.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zq.user.entity.LuckyName;
import org.springframework.stereotype.Repository;
@Repository
public interface LuckyNameDao extends BaseMapper<LuckyName> {
}
package com.zq.user.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zq.user.entity.ReplyCount;
import org.springframework.stereotype.Repository;
@Repository
public interface ReplyCountDao extends BaseMapper<ReplyCount> {
void update(ReplyCount reply);
}
......@@ -67,4 +67,10 @@ public class AnswerRec {
@ApiModelProperty("抽奖活动名")
private String lotteryName;
/**
* 答题次数
*/
@ApiModelProperty("答题次数")
private Integer replyCount;
}
package com.zq.user.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName(value = "t_lucky_name")
public class LuckyName {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty("中奖姓名")
private String luckyName;
@ApiModelProperty("中奖电话")
private String luckyPhone;
@ApiModelProperty("中奖地址")
private String luckyAddress;
/**
* 创建时间
*/
@ApiModelProperty("创建时间")
private Date createTime;
}
package com.zq.user.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName(value = "reply_count")
public class ReplyCount {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 答题次数
*/
@ApiModelProperty("答题次数")
private Integer replyCount;
/**
* 用户ID
*/
@ApiModelProperty("用户ID")
private String userId;
}
......@@ -53,6 +53,7 @@ PrizeService {
private final QuestionService questionService;
private final AnswerRecDao answerRecDao;
private final AddressDao addressDao;
private final LuckyNameDao luckyNameDao;
......@@ -357,4 +358,9 @@ PrizeService {
return findVos;
}
public ResultVo getLuckyList() {
List<LuckyName> list = luckyNameDao.selectList(new LambdaQueryWrapper<LuckyName>().orderByDesc(LuckyName::getCreateTime));
return ResultVo.success(list);
}
}
......@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.zq.common.utils.AssertUtils;
import com.zq.common.utils.PagingUtils;
import com.zq.common.vo.PageVo;
import com.zq.common.vo.ResultVo;
import com.zq.user.dao.AnswerRecDao;
import com.zq.user.dao.LotteryInfoDao;
import com.zq.user.dao.QuestionDao;
......
package com.zq.user.utils;
import java.lang.annotation.*;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LimitRequest {
//毫秒,分钟,小时 之间的转换用算数
long time() default 60000 * 60 * 24; // 限制时间 单位:毫秒
int count() default Integer.MAX_VALUE; // 允许请求的次数
}
package com.zq.user.utils;
import net.jodah.expiringmap.ExpirationPolicy;
import net.jodah.expiringmap.ExpiringMap;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
@Aspect
@Component
public class LimitRequestAspect {
private static ConcurrentHashMap<String, ExpiringMap<String, Integer>> book = new ConcurrentHashMap<>();
// 定义切点
// 让所有有@LimitRequest注解的方法都执行切面方法
@Pointcut("@annotation(limitRequest)")
public void excudeService(LimitRequest limitRequest) {
}
@Around("excudeService(limitRequest)")
public Object doAround(ProceedingJoinPoint pjp, LimitRequest limitRequest) throws Throwable {
// 获得request对象
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
// 获取Map对象, 如果没有则返回默认值
// 第一个参数是key, 第二个参数是默认值
ExpiringMap<String, Integer> map = book.getOrDefault(request.getRequestURI(), ExpiringMap.builder().variableExpiration().build());
Integer uCount = map.getOrDefault(request.getRemoteAddr(), 0);
if (uCount >= limitRequest.count()) { // 超过次数,不执行目标方法
//这里的返回对象类型根据controller方法的返回方式一致
return "接口访问次数超过限制,请24小时候重试";
} else if (uCount == 0){ // 第一次请求时,设置开始有效时间
map.put(request.getRemoteAddr(), uCount + 1, ExpirationPolicy.CREATED, limitRequest.time(), TimeUnit.MILLISECONDS);
} else { // 未超过次数, 记录数据加一
map.put(request.getRemoteAddr(), uCount + 1);
}
book.put(request.getRequestURI(), map);
// result的值就是被拦截方法的返回值
Object result = pjp.proceed();
return result;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment