Browse Source

1228合并

master
zhangye 6 years ago
parent
commit
0b2772b0ee
  1. 1
      cloudutil/src/main/java/com/ccsens/cloudutil/aspect/MustLoginAspect.java
  2. 12
      game/src/main/java/com/ccsens/game/api/ClientController.java
  3. 11
      game/src/main/java/com/ccsens/game/api/ScreenController.java
  4. 13
      game/src/main/java/com/ccsens/game/bean/dto/ScreenDto.java
  5. 8
      game/src/main/java/com/ccsens/game/bean/vo/ScreenVo.java
  6. 10
      game/src/main/java/com/ccsens/game/config/BeanConfig.java
  7. 44
      game/src/main/java/com/ccsens/game/config/CorsConfig.java
  8. 6
      game/src/main/java/com/ccsens/game/config/SpringConfig.java
  9. 27
      game/src/main/java/com/ccsens/game/service/ClientService.java
  10. 7
      game/src/main/java/com/ccsens/game/service/IScreenService.java
  11. 40
      game/src/main/java/com/ccsens/game/service/ScreenService.java
  12. 5
      game/src/main/java/com/ccsens/game/util/GameConstant.java
  13. 8
      util/src/main/java/com/ccsens/util/CodeEnum.java
  14. 37
      util/src/main/java/com/ccsens/util/config/RabbitMQConfig.java
  15. 29
      util/src/main/java/com/ccsens/util/mq/DelayConsumer.java
  16. 53
      util/src/main/java/com/ccsens/util/mq/DelayProducer.java

1
cloudutil/src/main/java/com/ccsens/cloudutil/aspect/MustLoginAspect.java

@ -45,6 +45,7 @@ public class MustLoginAspect {
HttpServletRequest request = ((ServletRequestAttributes)
RequestContextHolder.getRequestAttributes()).getRequest();
final String authHeader = request.getHeader(WebConstant.HEADER_KEY_TOKEN);
Object[] args = pjp.getArgs();

12
game/src/main/java/com/ccsens/game/api/ClientController.java

@ -1,5 +1,6 @@
package com.ccsens.game.api;
import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.game.bean.dto.ClientDto;
import com.ccsens.game.bean.dto.ScreenDto;
import com.ccsens.game.bean.vo.ClientVo;
@ -34,4 +35,15 @@ public class ClientController {
ClientVo.RankingAll rankingAll = clientService.getRankingAll(params);
return JsonResponse.newInstance().ok(rankingAll);
}
@MustLogin
@ApiOperation(value = "参加游戏", notes = "")
@ApiImplicitParams({
})
@RequestMapping(value = "joinGame", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<ClientVo.Join> joinGame(@ApiParam @Validated @RequestBody QueryDto<ClientDto.Join> params) throws Exception {
log.info("查看全部排行榜:{}",params);
ClientVo.Join join = clientService.join(params.getParam(), params.getUserId());
return JsonResponse.newInstance().ok(join);
}
}

11
game/src/main/java/com/ccsens/game/api/ScreenController.java

@ -26,7 +26,7 @@ public class ScreenController {
@Autowired
private IScreenService screenService;
@MustLogin
// @MustLogin
@ApiOperation(value = "获取大屏路径", notes = "")
@RequestMapping(value = "url", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<ScreenVo.UrlVo> getScreenUrl(@ApiParam @Validated @RequestBody QueryDto<ScreenDto.MemberGame> params) throws Exception {
@ -59,10 +59,10 @@ public class ScreenController {
@ApiImplicitParams({
})
@RequestMapping(value = "start", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse startGame(@ApiParam @Validated @RequestBody ScreenDto.MemberRecordAndTime memberRecordAndTime) throws Exception {
log.info("开始游戏:{}",memberRecordAndTime);
return JsonResponse.newInstance().ok();
public JsonResponse startGame(@ApiParam @Validated @RequestBody QueryDto<ScreenDto.Start> params) throws Exception {
log.info("开始游戏:{}",params);
ScreenVo.StartGame startGame = screenService.startGame(params.getParam());
return JsonResponse.newInstance().ok(startGame);
}
@Login
@ -75,4 +75,5 @@ public class ScreenController {
String url = screenService.startAgain(params);
return JsonResponse.newInstance().ok(url);
}
}

13
game/src/main/java/com/ccsens/game/bean/dto/ScreenDto.java

@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class ScreenDto {
@Data
@ -30,4 +32,15 @@ public class ScreenDto {
@ApiModelProperty("本地时间")
private Long localTime;
}
@Data
@ApiModel("ScreenDtoStart")
public static class Start {
@NotNull(message = "请选择游戏")
@ApiModelProperty("游戏记录id")
private Long urlId;
@NotNull(message = "请输入时间")
@ApiModelProperty("本地时间")
private Long localTime;
}
}

8
game/src/main/java/com/ccsens/game/bean/vo/ScreenVo.java

@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ -116,4 +117,11 @@ public class ScreenVo {
@ApiModelProperty("分数")
private int score;
}
@Data
@ApiModel("游戏开始")
public static class StartGame{
@ApiModelProperty("本地开始时间")
private Long startLocalTime;
}
}

10
game/src/main/java/com/ccsens/game/config/BeanConfig.java

@ -26,9 +26,9 @@ public class BeanConfig {
/**
* 注册拦截器
*/
@Bean
public MybatisInterceptor mybatisInterceptor() {
MybatisInterceptor interceptor = new MybatisInterceptor();
return interceptor;
}
// @Bean
// public MybatisInterceptor mybatisInterceptor() {
// MybatisInterceptor interceptor = new MybatisInterceptor();
// return interceptor;
// }
}

44
game/src/main/java/com/ccsens/game/config/CorsConfig.java

@ -0,0 +1,44 @@
//package com.ccsens.game.config;
//
//import org.springframework.core.annotation.Order;
//
//import javax.servlet.*;
//import javax.servlet.annotation.WebFilter;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//
///**
// * 实现基本的跨域请求
// * @author linhongcun
// *
// */
//@Order(1)
//@WebFilter(filterName = "MSecurity",urlPatterns = {"**"})
//public class CorsConfig implements Filter {
//
// @Override
// public void destroy() {
//
// }
//
// @Override
// public void doFilter(ServletRequest req, ServletResponse res,
// FilterChain chain) throws IOException, ServletException {
// HttpServletResponse response = (HttpServletResponse) res;
// response.setHeader("Access-Control-Allow-Origin", "*");
// response.setHeader("Access-Control-Request-Headers", "content-type,x-requested-with");
// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
// response.setHeader("Access-Control-Max-Age", "3600");
// response.setHeader("Access-Control-Allow-Credentials", "true");
// response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,token");
// response.setHeader("Access-Control-Expose-Headers", "Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma");
// chain.doFilter(req, res);
//
// }
//
// @Override
// public void init(FilterConfig arg0) throws ServletException {
//
// }
//
//}

6
game/src/main/java/com/ccsens/game/config/SpringConfig.java

@ -79,6 +79,12 @@ public class SpringConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS");
// .allowedMethods("*") // 允许提交请求的方法,*表示全部允许
// .allowedOrigins("*") // #允许向该服务器提交请求的URI,*表示全部允许
// .allowCredentials(true) // 允许cookies跨域
// .allowedHeaders("*") // #允许访问的头信息,*表示全部
// .maxAge(18000L); // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
}
/**

27
game/src/main/java/com/ccsens/game/service/ClientService.java

@ -19,6 +19,7 @@ import com.ccsens.util.CodeEnum;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.RedisUtil;
import com.ccsens.util.exception.BaseException;
//import com.ccsens.util.mq.DelayProducer;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
@ -52,6 +53,8 @@ public class ClientService implements IClientService {
private RedisUtil redisUtil;
@Autowired
private TallFeignClient tallFeignClient;
// @Autowired
// private DelayProducer delaySender;
@Override
public ClientVo.Join join(ClientDto.Join join, Long userId) {
@ -88,7 +91,10 @@ public class ClientService implements IClientService {
joinVo.setCompletedData(completedData);
return joinVo;
}
//准备中
boolean prepare = gameRecord.getGameStatus().byteValue() == GameConstant.GAME_PREPARATION;
//进行中
boolean processing = gameRecord.getGameStatus().byteValue() == GameConstant.GAME_PROCESSING;
// 2.保存游戏路径用户表(设置游戏路径ID+用户ID组合为唯一索引 replace)
@ -99,7 +105,7 @@ public class ClientService implements IClientService {
userJoin.setTimeDifference(timeMore);
userJoin.setLocalStartTime(prepare || processing ? gameRecord.getStartTime() + timeMore : 0);
userJoin.setLocalStartTime(prepare || processing ? gameRecord.getEndTime() + timeMore : 0);
userJoin.setLocalEndTime(prepare || processing ? gameRecord.getEndTime() + timeMore : 0);
// 获取头像和用户名
JsonResponse<MemberVo.MemberInfo> memberInfo = tallFeignClient.getMemberByUserId(userId, join.getProjectId());
if (memberInfo.getCode().intValue() == CodeEnum.SUCCESS.getCode() && memberInfo.getData() != null) {
@ -114,6 +120,21 @@ public class ClientService implements IClientService {
user.setNickname(userJoin.getNickname());
redisUtil.zsSet(GameConstant.generateGameKey(gameRecord.getId()), JSON.toJSONString(user), 0, GameConstant.REDIS_TIME);
//4.根据状态延时发送消息
if (prepare) {
//延时发送开始
long expiration = gameRecord.getStartTime() - System.currentTimeMillis();
//TODO 发送内容未定
// delaySender.sendDelayMessage("开始啦", expiration);
}
if (prepare || processing) {
//延时发送结束
long expiration = gameRecord.getEndTime() - System.currentTimeMillis();
//TODO 发送内容未定
// delaySender.sendDelayMessage("结束了", expiration);
}
//5.返回状态
return joinResult(userJoin, gameRecord);
@ -129,8 +150,8 @@ public class ClientService implements IClientService {
case GameConstant.GAME_PREPARATION :
// 准备中
ClientVo.PreparingData preparingData = new ClientVo.PreparingData();
preparingData.setStartLocalTime(join.getLocalStartTime());
preparingData.setEndLocalTime(join.getLocalEndTime());
preparingData.setStartLocalTime(join.getLocalStartTime() + join.getTimeDifference());
preparingData.setEndLocalTime(join.getLocalEndTime() + join.getTimeDifference());
joinVo.setPreparingData(preparingData);
break;
case GameConstant.GAME_PROCESSING :

7
game/src/main/java/com/ccsens/game/service/IScreenService.java

@ -12,4 +12,11 @@ public interface IScreenService {
ScreenVo.GameStatusVo getGameStatusVo(QueryDto<ScreenDto.MemberRecord> params);
String startAgain(QueryDto<ScreenDto.MemberRecord> params);
/**
* 游戏开始
* @param start
* @return
*/
ScreenVo.StartGame startGame(ScreenDto.Start start);
}

40
game/src/main/java/com/ccsens/game/service/ScreenService.java

@ -7,14 +7,15 @@ import com.ccsens.cloudutil.feign.TallFeignClient;
import com.ccsens.game.bean.dto.ScreenDto;
import com.ccsens.game.bean.dto.message.BaseMessageDto;
import com.ccsens.game.bean.dto.message.ChromeMessageDto;
import com.ccsens.game.bean.dto.message.GameMessageWithGetUrlDto;
import com.ccsens.game.bean.po.*;
import com.ccsens.game.bean.vo.ScreenVo;
import com.ccsens.game.persist.dao.*;
import com.ccsens.game.util.GameConstant;
import com.ccsens.util.CodeEnum;
import com.ccsens.util.WebConstant;
import com.ccsens.util.bean.dto.QueryDto;
import com.ccsens.util.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -47,6 +48,7 @@ public class ScreenService implements IScreenService{
private TallFeignClient tallFeignClient;
@Autowired
private IMessageService messageService;
@Autowired
private Snowflake snowflake;
@ -376,4 +378,40 @@ public class ScreenService implements IScreenService{
}
@Override
public ScreenVo.StartGame startGame(ScreenDto.Start start) {
long current = System.currentTimeMillis();
long moreTime = start.getLocalTime() - current;
//查询游戏
GameRecord gameRecord = gameRecordDao.selectByPrimaryKey(start.getUrlId());
log.info("游戏信息:{}", gameRecord);
if (gameRecord == null) {
throw new BaseException(CodeEnum.PARAM_ERROR);
}
//判断游戏状态,仅未开始允许操作开始
switch (gameRecord.getGameStatus().byteValue()) {
case GameConstant.GAME_PREPARATION: throw new BaseException(CodeEnum.GAME_PREPARATION);
case GameConstant.GAME_PROCESSING: throw new BaseException(CodeEnum.GAME_PROCESSING);
case GameConstant.GAME_COMPLETED: throw new BaseException(CodeEnum.GAME_COMPLETED);
}
//更新状态和时间
gameRecord.setGameStatus(GameConstant.GAME_PREPARATION);
gameRecord.setStartTime(current + GameConstant.COUNT_DOWN_TIME);
gameRecord.setEndTime(gameRecord.getStartTime() + GameConstant.GAME_TIME);
gameRecordDao.updateByPrimaryKeySelective(gameRecord);
//TODO
//延时通知
// delayProducer.sendDelayMessage("修改游戏开始状态",1L);
// delayProducer.sendDelayMessage("修改游戏结束状态",1L);
//查询游戏用户,通知游戏开始和结束
ScreenVo.StartGame startGame = new ScreenVo.StartGame();
startGame.setStartLocalTime(gameRecord.getStartTime() + moreTime);
return startGame;
}
}

5
game/src/main/java/com/ccsens/game/util/GameConstant.java

@ -19,6 +19,11 @@ public class GameConstant {
public static final String GAME_KEY = "_game";
/**数据默认保存 10分钟*/
public static final long REDIS_TIME = 600 ;
/**倒计时:10s ms值*/
public static final long COUNT_DOWN_TIME = 10*1000;
/**游戏时长:1分钟 ms值*/
public static final long GAME_TIME = 60*1000;
/**
* 生成游戏key

8
util/src/main/java/com/ccsens/util/CodeEnum.java

@ -77,8 +77,14 @@ public enum CodeEnum {
NOT_MEMBER(61,"对不起,找不到对应的成员信息",true),
NOT_GAME_RECORD(62,"对不起,找不到对应的游戏场次",true),
NOT_JOIN_GAME(63,"您还未加入游戏,请参加游戏后再试",true),
GAME_NO_END(64,"您的上一场游戏尚未结束,请勿重复开启",true),
GAME_NOT_TIMES(65,"游戏可玩次数不足,请充值后重试",true)
GAME_NOT_TIMES(65,"游戏可玩次数不足,请充值后重试",true),
GAME_PENDING(66, "游戏尚未开始,请等待主持人开始", true),
GAME_PREPARATION(67, "游戏已经开始倒计时了", true),
GAME_PROCESSING (68, "游戏已经在火热进行啦", true),
GAME_COMPLETED(69, "抱歉,您来晚了,游戏已结束", true)
;
public CodeEnum addMsg(String msg){

37
util/src/main/java/com/ccsens/util/config/RabbitMQConfig.java

@ -1,14 +1,20 @@
package com.ccsens.util.config;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RabbitMQConfig {
public static final String RabbitMQ_QUEUE_NAME = "Queue_Anyring";
public static final String TALL_MESSAGE_1 = "tall_message_1";
public static final String TALL_MESSAGE_2 = "tall_message_2";
public static final String GAME_STATUS_DELAY_SEND_QUEUE = "gameStatusDelaySendQueue";
public static final String GAME_STATUS_DELAY_SEND_EXCHANGE = "gameStatusDelaySendExchange";
public static final String GAME_STATUS_DELAY_SEND_ROUTING_KEY = "gameStatusDelaySendRoutingKey";
@Bean
public Queue queue (){
@ -23,4 +29,33 @@ public class RabbitMQConfig {
return new Queue(TALL_MESSAGE_2);
}
// /**
// * 延时发送队列
// * @return
// */
// @Bean
// public Queue delayQueue(){
// return QueueBuilder.durable(GAME_STATUS_DELAY_SEND_QUEUE).build();
// }
//
// /**
// * 延时交换机
// * @return
// */
// @Bean
// public CustomExchange delayExchange(){
// Map<String, Object> args = new HashMap<>();
// args.put("x-delayed-type", "direct");
// return new CustomExchange(GAME_STATUS_DELAY_SEND_EXCHANGE, "x-delayed-message", true, false, args);
// }
//
// /**
// * 绑定
// */
// @Bean
// Binding queueBinding(Queue delayQueue, CustomExchange customExchange) {
// return BindingBuilder.bind(delayQueue).to(customExchange).with(GAME_STATUS_DELAY_SEND_ROUTING_KEY).noargs();
// }
}

29
util/src/main/java/com/ccsens/util/mq/DelayConsumer.java

@ -0,0 +1,29 @@
//package com.ccsens.util.mq;
//
//import cn.hutool.core.date.DateUtil;
//import com.ccsens.util.config.RabbitMQConfig;
//import com.rabbitmq.client.AMQP;
//import org.springframework.amqp.rabbit.annotation.RabbitHandler;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.amqp.support.AmqpHeaders;
//import org.springframework.messaging.handler.annotation.Headers;
//import org.springframework.messaging.handler.annotation.Payload;
//import org.springframework.stereotype.Component;
//
//import java.util.Date;
//import java.util.Map;
//
///**
// * @description:
// * @author: wuHuiJuan
// * @create: 2019/12/27 15:40
// */
//@Component
//public class DelayConsumer {
// @RabbitListener(queues = RabbitMQConfig.GAME_STATUS_DELAY_SEND_QUEUE)
// @RabbitHandler
// public void receive(@Payload String msg, @Headers Map<String, Object> headers, AMQP.Channel channel ) {
// System.out.println("接收到的消息:"+msg +"||" + new Date());
// }
//
//}

53
util/src/main/java/com/ccsens/util/mq/DelayProducer.java

@ -0,0 +1,53 @@
//package com.ccsens.util.mq;
//
//import com.ccsens.util.config.RabbitMQConfig;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.rabbit.connection.CorrelationData;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
///**
// * @description:
// * @author: wuHuiJuan
// * @create: 2019/12/27 15:16
// */
//@Slf4j
//@Component
//public class DelayProducer {
// @Autowired
// private RabbitTemplate rabbitTemplate;
//
// //消息发送后的回调函数
// /**
// * 生产者回调函数:confirm确认消息投递成功
// */
// final RabbitTemplate.ConfirmCallback confirmCallback = (correlationData, ack, cause) -> {
//
// String messageId = correlationData.getId();
// if (ack) {
// log.info("消息投递成功,{}",messageId);
// //进行消息记录的数据库更新
//
// }else{
// log.info("消息投递失败");
// }
//
// };
//
// /**
// * 通过延迟消息插件发动延迟消息
// * @param msg
// * @param expiration
// */
// public void sendDelayMessage(Object msg, Long expiration){
//
// //绑定异步监听回调函数
// rabbitTemplate.setConfirmCallback(confirmCallback);
//
// rabbitTemplate.convertAndSend(RabbitMQConfig.GAME_STATUS_DELAY_SEND_EXCHANGE,RabbitMQConfig.GAME_STATUS_DELAY_SEND_ROUTING_KEY, msg,(message)->{
// message.getMessageProperties().setHeader("x-delay", expiration);//设置延迟时间
// return message;
// },new CorrelationData("123"));
// }
//}
Loading…
Cancel
Save