This commit is contained in:
DESKTOP-5RP3AKU\Jisol
2023-11-09 04:22:04 +08:00
parent 487219e6aa
commit ebf99de47a
34 changed files with 974 additions and 32 deletions

View File

@@ -1,17 +1,24 @@
package cn.jisol.game.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}

View File

@@ -0,0 +1,30 @@
package cn.jisol.game.config;
import cn.jisol.game.controller.argsresolver.UserMethodArgumentResolver;
import cn.jisol.game.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 添加登录拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/game/**");
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
WebMvcConfigurer.super.addArgumentResolvers(resolvers);
resolvers.add(new UserMethodArgumentResolver());
}
}

View File

@@ -0,0 +1,9 @@
package cn.jisol.game.controller;
public interface HttpCode {
//没有创建用户
int NOT_CREATE_PLAYER_INFO = 2001;
}

View File

@@ -0,0 +1,10 @@
package cn.jisol.game.controller.argsresolver;
import java.lang.annotation.*;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentUser {
}

View File

@@ -0,0 +1,41 @@
package cn.jisol.game.controller.argsresolver;
import cn.jisol.game.controller.exception.TokenException;
import cn.jisol.game.data.Cache;
import cn.jisol.game.entity.User;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import java.util.Objects;
@Component
public class UserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
if (parameter.hasParameterAnnotation(CurrentUser.class)) {
return true;
}
return false;
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
//获取Token
String token = nativeWebRequest.getHeader(Cache.KEY_TOKEN);
User user;
if(Objects.isNull(token) || Objects.isNull(user = Cache.TOKEN.get(token))){
//抛出Token异常
throw new TokenException();
}
return user;
}
}

View File

@@ -0,0 +1,8 @@
package cn.jisol.game.controller.exception;
public interface ExceptionEnum {
//Token 失效
Integer LOGIN_TOKEN = 1001;
}

View File

@@ -0,0 +1,27 @@
package cn.jisol.game.controller.exception;
import cn.jisol.ngame.util.NewsContext;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import static cn.jisol.game.controller.exception.ExceptionEnum.LOGIN_TOKEN;
@ControllerAdvice
public class HTTPExceptionHandler {
//登录异常
@ExceptionHandler(value = TokenException.class)
@ResponseBody
public NewsContext<String> loginExceptionHandler(TokenException e){
return NewsContext.onMessage("Token 失效",null,LOGIN_TOKEN);
}
//全局异常
@ExceptionHandler(value = Exception.class)
@ResponseBody
public NewsContext<String> exceptionHandler(Exception e){
e.printStackTrace();
return NewsContext.onFail("异常错误:"+e.getMessage());
}
}

View File

@@ -0,0 +1,4 @@
package cn.jisol.game.controller.exception;
public class TokenException extends Exception{
}

View File

@@ -0,0 +1,45 @@
package cn.jisol.game.controller.game;
import cn.jisol.game.controller.HttpCode;
import cn.jisol.game.controller.argsresolver.CurrentUser;
import cn.jisol.game.entity.User;
import cn.jisol.game.entity.game.Player;
import cn.jisol.game.service.PlayerService;
import cn.jisol.game.service.impl.PlayerServiceImpl;
import cn.jisol.ngame.util.NewsContext;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
/**
* 新手API
*/
@RestController
@RequestMapping("/game/player")
@ResponseBody
public class PlayerController {
@Autowired
PlayerServiceImpl playerService;
//获取玩家信息
@GetMapping("/info")
public NewsContext<Player> getPlayerInfo(@CurrentUser User user){
Player info = playerService.getOne(Wrappers.lambdaQuery(Player.class).eq(Player::getUserId,user.getUserId()));
if (Objects.isNull(info)){
//玩家没有进入过游戏 前往 新手引导
return NewsContext.onMessage("前往新手引导",null, HttpCode.NOT_CREATE_PLAYER_INFO);
}else{
return NewsContext.onSuccess("获取成功",info);
}
}
}

View File

@@ -10,6 +10,7 @@ import java.util.Map;
*/
public class Cache {
public static String KEY_TOKEN = "Token";
public static Map<String, User> TOKEN = new HashMap<>();
}

View File

@@ -0,0 +1,18 @@
package cn.jisol.game.entity.game;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
@Builder
@Data
@TableName("`player`")
public class Player {
@TableId(type = IdType.AUTO)
private Long playerId; //游戏玩家Id
private String userId; //玩家Id
private String playerName; //游戏玩家名称
private Long playerCreateTime; //玩家创建时间
}

View File

@@ -0,0 +1,20 @@
package cn.jisol.game.entity.game;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
/**
* 玩家宠物
*/
@Builder
@Data
@TableName("`player_pet`")
public class PlayerPet {
@TableId(type = IdType.AUTO)
private Long petId; //宠物唯一Id
private String petTbId; //宠物配置表Id
private String petGrade; //宠物等级
}

View File

@@ -0,0 +1,30 @@
package cn.jisol.game.interceptor;
import cn.jisol.game.controller.exception.TokenException;
import cn.jisol.game.data.Cache;
import cn.jisol.game.entity.User;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
/**
* 游戏登录拦截器
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取Token
String token = request.getHeader(Cache.KEY_TOKEN);
if(Objects.isNull(token) || Objects.isNull(Cache.TOKEN.get(token))) {
//抛出Token异常
throw new TokenException();
}
return true;
}
}

View File

@@ -0,0 +1,10 @@
package cn.jisol.game.mapper;
import cn.jisol.game.entity.game.Player;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Component;
@Component
public interface PlayerMapper extends BaseMapper<Player> {
}

View File

@@ -0,0 +1,9 @@
package cn.jisol.game.service;
import cn.jisol.game.entity.User;
import cn.jisol.game.entity.game.Player;
import com.baomidou.mybatisplus.extension.service.IService;
public interface PlayerService extends IService<Player> {
}

View File

@@ -0,0 +1,15 @@
package cn.jisol.game.service.impl;
import cn.jisol.game.entity.User;
import cn.jisol.game.entity.game.Player;
import cn.jisol.game.mapper.PlayerMapper;
import cn.jisol.game.mapper.UserMapper;
import cn.jisol.game.service.PlayerService;
import cn.jisol.game.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class PlayerServiceImpl extends ServiceImpl<PlayerMapper, Player> implements PlayerService {
}