diff --git a/lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java b/lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java index cbb393c..e8a3d06 100644 --- a/lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java +++ b/lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java @@ -2,6 +2,8 @@ package com.lottery.exception; import com.lottery.result.Result; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -10,6 +12,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.List; @@ -105,8 +108,18 @@ public class GlobalExceptionHandler { // 捕获自定义业务异常 @ExceptionHandler(BusinessException.class) - public Result handleBusinessException(BusinessException e) { - return Result.failure(e.getCode(), e.getMessage()); + public ResponseEntity handleBusinessException(BusinessException ex, HttpServletRequest request) { + HttpHeaders headers = new HttpHeaders(); + headers.set("Access-Control-Allow-Origin", "*"); // 或指定域名 + headers.set("Access-Control-Allow-Credentials", "true"); + // 构建统一的错误响应 + Result errorResult = Result.failure(ex.getCode(), ex.getMessage()); + + + return ResponseEntity + .status(ex.getCode()) // 使用 BusinessException 中的状态码 + .headers(headers) + .body(errorResult); // 返回 Result 作为响应体 } /** diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java index b77e1c6..2162a4d 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java @@ -1,6 +1,12 @@ package com.lottery.dto; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; /** * @program: lottery @@ -11,7 +17,13 @@ import lombok.Data; * @Version 1.0 **/ @Data +@NoArgsConstructor +@AllArgsConstructor +@Slf4j public class AdminLogin { + @NotNull(message = "用户名不能为空") + @Size(min = 8,max = 8,message = "用户名长度为8位") private String username; + @NotNull(message = "密码不能为空") private String password; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodeDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodeDto.java new file mode 100644 index 0000000..b795c90 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodeDto.java @@ -0,0 +1,29 @@ +package com.lottery.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * @program: lottery-system + * @ClassName UserByJwcodeDto + * @description: + * @author:jihaipeng + * @create: 2025−07-22 11:51 + * @Version 1.0 + **/ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Slf4j +public class UserByJwcodeDto { + @NotNull(message = "jwcode不能为空") + @Size(min = 8, max = 8, message = "jwcode必须是8位") + @Pattern(regexp = "^\\d{8}$", message = "jwcode必须全是数字") + private String jwcode; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodePageDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodePageDto.java new file mode 100644 index 0000000..74ec9b3 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserByJwcodePageDto.java @@ -0,0 +1,24 @@ +package com.lottery.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * @program: lottery-system + * @ClassName UserByJwcodePageDto + * @description: + * @author:jihaipeng + * @create: 2025−07-22 15:03 + * @Version 1.0 + **/ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Slf4j +public class UserByJwcodePageDto { + private String jwcode; + private int pageNum = 1; + private int pageSize = 10; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/JwcodeTable.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/JwcodeTable.java new file mode 100644 index 0000000..2527f6e --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/JwcodeTable.java @@ -0,0 +1,26 @@ +package com.lottery.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @program: lottery-system + * @ClassName JwcodeTable + * @description: + * @author:jihaipeng + * @create: 2025−07-22 15:11 + * @Version 1.0 + **/ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("jwcode_table") +public class JwcodeTable { + private String jwcode; + private LocalDateTime createTime; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/LoginUserVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/LoginUserVo.java new file mode 100644 index 0000000..75dedf9 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/LoginUserVo.java @@ -0,0 +1,26 @@ +package com.lottery.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @program: lottery-system + * @ClassName LoginUserVo + * @description: + * @author:jihaipeng + * @create: 2025−07-22 15:00 + * @Version 1.0 + **/ +@Data +@Slf4j +@NoArgsConstructor +@AllArgsConstructor +public class LoginUserVo { + private String jwcode; + private LocalDateTime createTime; +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminIsLoginController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminIsLoginController.java new file mode 100644 index 0000000..fb35d0d --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminIsLoginController.java @@ -0,0 +1,50 @@ +package com.lottery.admin.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.lottery.admin.service.AdminIsLoginService; +import com.lottery.dto.UserByJwcodeDto; +import com.lottery.dto.UserByJwcodePageDto; +import com.lottery.result.Result; +import com.lottery.vo.LoginUserVo; +import com.lottery.vo.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * @program: lottery-system + * @ClassName LoginController + * @description: + * @author:jihaipeng + * @create: 2025−07-22 11:15 + * @Version 1.0 + **/ +@RestController +@RequestMapping("/admin/isLogin") +public class AdminIsLoginController { + + @Autowired + private AdminIsLoginService adminIsLoginService; + //添加精网号 + @RequestMapping("/addUser") + public Result addUser(@RequestBody @Valid UserByJwcodeDto userDto) { + return adminIsLoginService.addUser(userDto.getJwcode()); + } + + //删除精网号 + @RequestMapping("/deleteUser") + public Result deleteUser(@RequestBody @Valid UserByJwcodeDto userDto) { + return adminIsLoginService.deleteUser(userDto.getJwcode()); + } + + //分页返回数据 + @RequestMapping("/selectByJwcode") + public Result> selectByJwcode(@RequestBody UserByJwcodePageDto userByJwcodePageDto) { + return adminIsLoginService.selectByJwcode(userByJwcodePageDto.getJwcode(), userByJwcodePageDto.getPageNum(), userByJwcodePageDto.getPageSize(),userByJwcodePageDto.getPageNum()); + } + + +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminIsLoginMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminIsLoginMapper.java new file mode 100644 index 0000000..5d8bcb5 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminIsLoginMapper.java @@ -0,0 +1,26 @@ +package com.lottery.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lottery.entity.JwcodeTable; +import org.apache.ibatis.annotations.Mapper; + +import java.time.LocalDateTime; + +/** + * @program: lottery-system + * @ClassName AdminIsLoginMappper + * @description: + * @author:jihaipeng + * @create: 2025−07-22 14:09 + * @Version 1.0 + **/ +@Mapper +public interface AdminIsLoginMapper extends BaseMapper { + + + void addUser(String jwcode, LocalDateTime now); + + Integer selectByJwcode(String jwcode); + + int deleteUser(String jwcode); +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminIsLoginService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminIsLoginService.java new file mode 100644 index 0000000..c76ee47 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminIsLoginService.java @@ -0,0 +1,27 @@ +package com.lottery.admin.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.lottery.entity.JwcodeTable; +import com.lottery.result.Result; +import com.lottery.vo.LoginUserVo; +import com.lottery.vo.PageInfo; +import org.apache.tomcat.Jar; + +/** + * @program: lottery-system + * @ClassName AdminIsLoginService + * @description: + * @author:jihaipeng + * @create: 2025−07-22 11:32 + * @Version 1.0 + **/ + +public interface AdminIsLoginService extends IService { + Result addUser(String jwcode); + + Result deleteUser(String jwcode); + + + Result> selectByJwcode(String jwcode, int pageNum, int pageSize, int pageNum1); +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminIsLoginServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminIsLoginServiceImpl.java new file mode 100644 index 0000000..671a259 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminIsLoginServiceImpl.java @@ -0,0 +1,79 @@ +package com.lottery.admin.service.Impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lottery.admin.mapper.AdminIsLoginMapper; +import com.lottery.admin.service.AdminIsLoginService; +import com.lottery.entity.JwcodeTable; +import com.lottery.result.Result; +import com.lottery.utils.ConvertBeanUtil; +import com.lottery.vo.LoginUserVo; +import com.lottery.vo.PageInfo; +import org.springframework.beans.ConversionNotSupportedException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @program: lottery-system + * @ClassName AdminIsLoginServiceImpl + * @description: + * @author:jihaipeng + * @create: 2025−07-22 11:36 + * @Version 1.0 + **/ +@Service +public class AdminIsLoginServiceImpl extends ServiceImpl implements AdminIsLoginService { + + @Autowired + private AdminIsLoginMapper adminIsLoginMappper; + + @Override + public Result addUser(String jwcode) { + Integer isLogin = adminIsLoginMappper.selectByJwcode(jwcode); + //检查一下是否已经添加过了 + if(isLogin != null && isLogin > 0){ + return Result.failure("该用户已经添加过了"); + } + LocalDateTime now = LocalDateTime.now(); + adminIsLoginMappper.addUser(jwcode,now); + return Result.success("添加成功"); + } + + @Override + public Result deleteUser(String jwcode) { + + Long total = adminIsLoginMappper.selectCount(null); + + System.out.println(total); + if(total <= 1) { + return Result.failure("至少要保留一个用户"); + } + + int count = adminIsLoginMappper.deleteUser(jwcode); + + if(count > 0){ + return Result.success("删除成功"); + }else { + return Result.failure("删除失败,可能该用户不存在"); + } + } + + @Override + public Result> selectByJwcode(String jwcode, int pageNum, int pageSize, int pageNum1) { + Page usePage = new Page<>(pageNum, pageSize); + LambdaQueryWrapper jwcodeTableLambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (jwcode != null){ + jwcodeTableLambdaQueryWrapper.like(JwcodeTable::getJwcode, jwcode); + } + Page jwcodeTablePage = adminIsLoginMappper.selectPage(usePage, jwcodeTableLambdaQueryWrapper); + List records = jwcodeTablePage.getRecords(); + List loginUserVos = ConvertBeanUtil.convertList(records, LoginUserVo.class); + return Result.success(PageInfo.of(jwcodeTablePage, loginUserVos)); + } +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java index 1f43e9b..4a9533b 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.lottery.admin.controller.AdminUserController; +import com.lottery.admin.mapper.AdminIsLoginMapper; import com.lottery.admin.mapper.AdminUserDetailMapper; import com.lottery.admin.mapper.AdminUserMapper; import com.lottery.admin.mapper.AdminWinMapper; @@ -29,10 +30,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.json.JSONObject; +import javax.persistence.criteria.CriteriaBuilder; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -54,6 +57,10 @@ public class AdminUserServiceImpl extends ServiceImpl imp private AdminUserMapper adminUserMapper; private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class); + + @Autowired + private StringRedisTemplate redisTemplate; + @Autowired private AdminUserDetailMapper adminUserDetailMapper; @@ -62,11 +69,18 @@ public class AdminUserServiceImpl extends ServiceImpl imp @Autowired private com.lottery.propertise.jwtPropertice jwtPropertice; + @Autowired - private RedisTemplate redisTemplate; + private AdminIsLoginMapper adminIsLoginMapper; @Override - public Result AdminUserlogin(AdminLogin adminLogin) { + public Result AdminUserlogin(AdminLogin adminLogin) { + //查看是否有权限 + Integer isLogin = adminIsLoginMapper.selectByJwcode(adminLogin.getUsername()); + if(isLogin == null || isLogin <= 0){ + return Result.failure("用户无权限登录"); + } + String token = ""; try { // 1. 准备请求参数 @@ -89,11 +103,8 @@ public class AdminUserServiceImpl extends ServiceImpl imp if (jsonResponse.getInt("code") == 200) { JSONObject data = jsonResponse.getJSONObject("data"); token = data.getString("token"); -// String username = data.getString("username"); - LOGGER.info("登录成功,Token:{} " ,token); - // 后续可以使用token调用其他API } else { LOGGER.error(jsonResponse.getString("msg")); @@ -107,9 +118,7 @@ public class AdminUserServiceImpl extends ServiceImpl imp UserLoginVo userLoginVo = new UserLoginVo(); userLoginVo.setUsername(adminLogin.getUsername()); userLoginVo.setToken(token); - //把token传入redis - redisTemplate.opsForValue().set(token, userLoginVo.getUsername(),2, TimeUnit.HOURS); - + redisTemplate.opsForValue().set( "token:"+token, adminLogin.getUsername(),24, TimeUnit.HOURS); return Result.success(userLoginVo); } @@ -242,7 +251,6 @@ public class AdminUserServiceImpl extends ServiceImpl imp } } - @Override public void removeUserById(Long id) { //关联删除user_detail diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java index caa2301..bd2caea 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java @@ -34,21 +34,21 @@ public class ApiFundingController { //前台获取活动详情 @PostMapping("/getActivity") - public Result getFundingActivity(@RequestHeader String token){ - if(token == null|| token.trim().isEmpty()){ + public Result getFundingActivity(@RequestHeader String Apitoken){ + if(Apitoken == null|| Apitoken.trim().isEmpty()){ return Result.failure("请先登录"); } LOGGER.info("前台获取众筹活动所有数据"); - return fundingService.getActivityDetailOne(token); + return fundingService.getActivityDetailOne(Apitoken); } //添加用户参与记录 @PostMapping("/addRecord") - public Result addRecord(@RequestHeader String token,@RequestBody @Valid FundingRecordDto fundingRecordDto) throws Exception { - if(token == null|| token.trim().isEmpty()){ + public Result addRecord(@RequestHeader String Apitoken,@RequestBody @Valid FundingRecordDto fundingRecordDto) throws Exception { + if(Apitoken == null|| Apitoken.trim().isEmpty()){ return Result.failure("请先登录"); } LOGGER.info("添加用户参与记录,参数为{}", fundingRecordDto); - return fundingService.addRecord(token,fundingRecordDto); + return fundingService.addRecord(Apitoken,fundingRecordDto); } } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java index d4b7d28..049f7d6 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java @@ -14,6 +14,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; @@ -39,6 +41,7 @@ public class ApiFundingServiceImpl implements ApiIFundingService { @Override public Result getActivityDetailOne(String token) { + String token1 = URLDecoder.decode(token, StandardCharsets.UTF_8); //根据活动id查询活动时间,市场一,市场二,设置的初始时间,俩个市场总助力次数 //先查询一下有几个活动开启 @@ -67,11 +70,11 @@ public class ApiFundingServiceImpl implements ApiIFundingService { try { // 1. 定义请求 URL - String url = "https://api.homilychart.com/hljw/api/v2/member/info"; + String url = "http://39.101.133.168:8828/hljw/api/v2/member/info"; // 准备请求参数 Map params = new HashMap<>(); - params.put("token", token); // 如果接口需要 token 作为参数 + params.put("token", token1); // 如果接口需要 token 作为参数 // 调用接口 String response = HttpUtils.postUrlencoded(url, params); JsonNode rootNode = objectMapper.readTree(response); @@ -153,7 +156,7 @@ public class ApiFundingServiceImpl implements ApiIFundingService { @Override public Result addRecord(String token,FundingRecordDto fundingRecordDto) { - + String token1 = URLDecoder.decode(token, StandardCharsets.UTF_8); //检查活动id是否存在 Integer count = fundingMapper.selectActivityISExist(fundingRecordDto.getActivityId()); if(count == null || count == 0){ @@ -166,14 +169,18 @@ public class ApiFundingServiceImpl implements ApiIFundingService { try { // 1. 定义请求 URL - String url = "https://api.homilychart.com/hljw/api/v2/member/info"; + String url = "http://39.101.133.168:8828/hljw/api/v2/member/info"; // 准备请求参数 Map params = new HashMap<>(); - params.put("token", token); // 如果接口需要 token 作为参数 + + params.put("token", token1); // 如果接口需要 token 作为参数 // 调用接口 String response = HttpUtils.postUrlencoded(url, params); JsonNode rootNode = objectMapper.readTree(response); + if(rootNode.path("code").asInt() == 401){ + return Result.failure("登录凭证错误"); + } // 提取 username String username = rootNode.path("data").path("username").asText(); String jwcode = rootNode.path("data").path("jwcode").asText(); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java b/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java index f37a650..e69de29 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java @@ -1,32 +0,0 @@ -package com.lottery.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * @program: lottery - * @ClassName CorsConfig - * @description: - * @author: wwl - * @create: 2025-07-18 10:21 - * @Version 1.0 - **/ - -@Configuration -public class CorsConfig implements WebMvcConfigurer { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOrigins("*") // 允许所有来源 - .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") - .allowedHeaders("*"); - -// registry.addMapping("/**") -// .allowedOriginPatterns("*") // 允许所有来源模式 -// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") -// .allowedHeaders("*") -// .allowCredentials(true); // 允许携带凭证(如cookie、认证头) - - } -} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/config/WebConfig.java b/lottery-system/lottery-service/src/main/java/com/lottery/config/WebConfig.java new file mode 100644 index 0000000..a58946d --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/config/WebConfig.java @@ -0,0 +1,41 @@ +package com.lottery.config; + +import com.lottery.interceptor.AuthInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @program: lottery-system + * @ClassName WebConfig + * @description: + * @author:jihaipeng + * @create: 2025−07-22 16:46 + * @Version 1.0 + **/ + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Autowired + private AuthInterceptor authInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(authInterceptor) + .addPathPatterns("/**") // 拦截所有请求 + .excludePathPatterns( // 放行不需要校验的路径 + "/login" // 登录接口 + ); + } + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") // 允许所有来源 + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*"); + } +} \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/interceptor/AuthInterceptor.java b/lottery-system/lottery-service/src/main/java/com/lottery/interceptor/AuthInterceptor.java new file mode 100644 index 0000000..210bb3b --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/interceptor/AuthInterceptor.java @@ -0,0 +1,74 @@ +package com.lottery.interceptor; + +import com.lottery.exception.BusinessException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @program: lottery-system + * @ClassName AuthInterceptor + * @description: + * @author:jihaipeng + * @create: 2025−07-22 16:19 + * @Version 1.0 + **/ +@Component +public class AuthInterceptor implements HandlerInterceptor { + + @Autowired + private StringRedisTemplate redisTemplate; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + // 放行 OPTIONS 预检请求 + if ("OPTIONS".equals(request.getMethod())) { + return true; + } + + // 1. 放行登录接口(/login) + if ("/admin/user/login".equals(request.getRequestURI())) { + return true; + } + if("/api/prize/list".equals(request.getRequestURI())) { + return true; + } + if("/api/user/list".equals(request.getRequestURI())) { + return true; + } + if("/admin/win/list".equals(request.getRequestURI())) { + return true; + } + if("/api/lottery/start".equals(request.getRequestURI())) { + return true; + } + if("/api/funding/addRecord".equals(request.getRequestURI())) { + return true; + } + if("/api/funding/getActivity".equals(request.getRequestURI())) { + return true; + } + + + // 2. 检查其他接口是否携带 Token + String token = request.getHeader("Token"); + if (token == null || token.isEmpty()) { + + throw new BusinessException(400,"登录缺失凭证,请重新登录"); + } + + // 3. 校验 Token 是否在 Redis 中存在 + String redisKey = "token:" + token; + if (!Boolean.TRUE.equals(redisTemplate.hasKey(redisKey))) { + throw new BusinessException(400,"用户登录已失效,请重新登录"); + } + // 4. Token 校验通过,放行请求 + return true; + + } + +} diff --git a/lottery-system/lottery-service/src/main/resources/application.yml b/lottery-system/lottery-service/src/main/resources/application.yml index f0e242f..c24c958 100644 --- a/lottery-system/lottery-service/src/main/resources/application.yml +++ b/lottery-system/lottery-service/src/main/resources/application.yml @@ -8,10 +8,6 @@ spring: username: link password: tEhdERkaGprEA7nT driver-class-name: com.mysql.cj.jdbc.Driver -# hikari: -# pool-name: LotteryHikariCP -# maximum-pool-size: 10 # 连接池大小 -# connection-timeout: 30000 hikari: maximum-pool-size: 20 # 默认一般是 10,根据并发量调整 @@ -20,14 +16,13 @@ spring: max-lifetime: 1800000 # 连接最大生命周期(默认 30 分钟) leak-detection-threshold: 5000 # 连接泄漏检测(毫秒,建议 5s) -# # ========== Redis 配置 ========== redis: host: 39.98.127.73 port: 7001 password: 2TOVfFeJ0pyi9Wtj - database: 8 # 默认DB索引 - lettuce: + database: 1 # 默认DB索引 + jedis: pool: max-active: 100 # 最大连接数 max-wait: 300 # 最大等待时间 diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminIsLoginMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminIsLoginMapper.xml new file mode 100644 index 0000000..c401571 --- /dev/null +++ b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminIsLoginMapper.xml @@ -0,0 +1,21 @@ + + + + + + + INSERT INTO jwcode_table(jwcode,create_time) VALUES (#{jwcode},#{now}) + + + DELETE FROM jwcode_table WHERE jwcode = #{jwcode} + + + + \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/resources/mapper/api/userDetailMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/api/AdminIsLoginMapper.xml similarity index 100% rename from lottery-system/lottery-service/src/main/resources/mapper/api/userDetailMapper.xml rename to lottery-system/lottery-service/src/main/resources/mapper/api/AdminIsLoginMapper.xml