Browse Source

后端整合模块

detached
huangqizhen 5 months ago
parent
commit
86251b4916
  1. 2
      src/main/java/com/example/demo/Util/JWTUtil.java
  2. 25
      src/main/java/com/example/demo/controller/KafkaConsumer.java
  3. 42
      src/main/java/com/example/demo/controller/RechargeController.java
  4. 8
      src/main/java/com/example/demo/domain/entity/Recharge.java
  5. 1
      src/main/java/com/example/demo/domain/vo/ConsumeDetail.java
  6. 8
      src/main/java/com/example/demo/mapper/ConsumeMapper.java
  7. 4
      src/main/java/com/example/demo/mapper/DetailMapper.java
  8. 14
      src/main/java/com/example/demo/mapper/RechargeMapper.java
  9. 222
      src/main/java/com/example/demo/security/TokenFilter.java
  10. 5
      src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java
  11. 1
      src/main/resources/application.yml

2
src/main/java/com/example/demo/Util/JWTUtil.java

@ -138,7 +138,7 @@ public class JWTUtil {
*/
public static Claims parseJWT(String jwt) throws Exception {
SecretKey secretKey = generalKey();
System.out.println(jwt+"-----------------------++++++++++++++++++++++-");
System.out.println(jwt);
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)

25
src/main/java/com/example/demo/controller/KafkaConsumer.java

@ -5,12 +5,16 @@ import com.example.demo.domain.entity.DetailY;
import com.example.demo.domain.entity.Recharge;
import com.example.demo.serviceImpl.ConsumeServiceImpl;
import com.example.demo.sevice.RechargeService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.List;
@Service
@Slf4j
public class KafkaConsumer {
@ -23,6 +27,27 @@ public class KafkaConsumer {
private final ObjectMapper objectMapper = new ObjectMapper();
@KafkaListener(topics = "rechargeadd_topic")
public void listenRechargeadd(String message) {
try {
// 反序列化为List<Recharge>
List<Recharge> rechargeList = objectMapper.readValue(message, new TypeReference<List<Recharge>>() {});
// 遍历并处理每个充值记录
for (Recharge recharge : rechargeList) {
processRecharge(recharge);
}
} catch (IOException e) {
// 处理反序列化异常
e.printStackTrace();
}
}
private void processRecharge(Recharge recharge) {
// 具体的业务处理逻辑
System.out.println("Processing recharge: " + recharge);
}
@KafkaListener(topics = "consume-topic", groupId = "my-group")
public void listenConsume(String message) {
try {

42
src/main/java/com/example/demo/controller/RechargeController.java

@ -10,10 +10,14 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/recharge/recharge")
@ -23,26 +27,50 @@ import java.util.List;
public class RechargeController {
private final RechargeService rechargeService;
private final ObjectMapper objectMapper; // 添加这一行
@Autowired
private KafkaProducer kafkaProducer;
@PostMapping("/addmore")
public Result add(@RequestBody List<Recharge> recharge) {
public Result add(@RequestBody Map<String, Object> requestBody) {
try {
// 获取 token 字段
String token = (String) requestBody.get("token");
if (StringUtils.hasText(token)) {
// processToken(token); // 移除或注释掉这一行
}
// 提取并转换所有的 Recharge 对象
List<Recharge> recharges = requestBody.entrySet().stream()
.filter(entry -> !entry.getKey().equals("token"))
.map(entry -> {
try {
return objectMapper.convertValue(entry.getValue(), Recharge.class);
} catch (IllegalArgumentException e) {
log.warn("Failed to convert entry: {}", entry.getKey(), e);
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (recharges.isEmpty()) {
return Result.error("No valid recharge data found.");
}
// Recharge 对象转换为 JSON 字符串
ObjectMapper objectMapper = new ObjectMapper();
String rechargeJson = objectMapper.writeValueAsString(recharge);
String rechargeJson = objectMapper.writeValueAsString(recharges);
// 发送消息到 Kafka 队列
kafkaProducer.sendMessage("recharge-topic", rechargeJson);
kafkaProducer.sendMessage("rechargeadd-topic", rechargeJson);
return rechargeService.addRecharges(recharge);
return rechargeService.addRecharges(recharges);
} catch (Exception e) {
log.error(Arrays.toString(e.getStackTrace()));
log.error("Error processing /addmore request", e);
return Result.error(e.getMessage());
}
}
@PostMapping("/add")
public Result add(@RequestBody Recharge recharge) {
try {

8
src/main/java/com/example/demo/domain/entity/Recharge.java

@ -10,6 +10,7 @@ import java.util.Date;
@Data
@NoArgsConstructor
public class Recharge {
private Integer rechargeId;
private String jwcode;
@ -33,5 +34,10 @@ public class Recharge {
private Date endDate;
private String orderCode;
private String token;
private Integer rateId;
private Integer rateId;
private Integer line;
private String showInput;
private String imageUrl;
private String rate;
}

1
src/main/java/com/example/demo/domain/vo/ConsumeDetail.java

@ -44,5 +44,6 @@ public class ConsumeDetail {
private Integer auditId;
private String token;
private Integer refundId;
private String productName;
}

8
src/main/java/com/example/demo/mapper/ConsumeMapper.java

@ -52,11 +52,11 @@ public interface ConsumeMapper {
"<where>",
// "`detail_flag`=1 AND update_type = '1'",
"update_type=1",
"<if test='jwcode!=null'>and detail.jwcode =#{jwcode}</if>",
"<if test='jwcode!=null'>and detail_y.jwcode =#{jwcode}</if>",
"<if test='productName!=null'>and product.name = #{productName}</if>",
"<if test='consumePlatform!=null'>and detail.consume_platform=#{consumePlatform}</if>",
"<if test='consumeType!=null'>and detail.consume_type= #{consumeType}</if>",
"<if test='startDate != null and endDate != null'>AND detail.create_time BETWEEN #{startDate} AND #{endDate}</if>",
"<if test='consumePlatform!=null'>and detail_y.consume_platform=#{consumePlatform}</if>",
"<if test='consumeType!=null'>and detail_y.consume_type= #{consumeType}</if>",
"<if test='startDate != null and endDate != null'>AND detail_y.create_time BETWEEN #{startDate} AND #{endDate}</if>",
"</where>",
"ORDER BY detail_y.create_time DESC",
"</script>"

4
src/main/java/com/example/demo/mapper/DetailMapper.java

@ -14,10 +14,10 @@ public interface DetailMapper {
@Insert({
"insert into detail",
"(jwcode,order_code,activity_id,recharge_way,product_id,consume_platform,consume_type,refund_type,refund_goods," +
"(jwcode,order_code,activity_id,recharge_way,product_id,consume_type,refund_type,refund_goods," +
"contact_id,remark,recharge_coin,free_coin,task_coin,admin_id,update_type,detail_flag,create_time,first_recharge)",
"values ",
"(#{jwcode},#{orderCode},#{activityId},#{rechargeWay},#{productId},#{consumePlatform},#{consumeType},#{refundType}" +
"(#{jwcode},#{orderCode},#{activityId},#{rechargeWay},#{productId},#{consumeType},#{refundType}" +
",#{refundGoods},#{contactId},#{remark},#{rechargeCoin}" +
",#{freeCoin},#{taskCoin},#{adminId},#{updateType},1,now(),#{firstRecharge})"
})

14
src/main/java/com/example/demo/mapper/RechargeMapper.java

@ -19,16 +19,20 @@ public interface RechargeMapper {
@Options(useGeneratedKeys = true,keyColumn = "recharge_id",keyProperty = "rechargeId")
int insert(Recharge recharge);
@Insert({
"<script>",
"INSERT INTO recharge (",
"jwcode, order_code, activity_id, paid_gold, free_gold, recharge_gold, pay_way, recharge_way, recharge_time, recharge_voucher, admin_id, remark, flag)",
"VALUES ",
"<foreach collection='list' item='recharge' separator=','>",
"(#{recharge.jwcode}, #{recharge.orderCode}, #{recharge.activityId}, #{recharge.paidGold}, #{recharge.freeGold}, #{recharge.rechargeGold}, #{recharge.payWay}, #{recharge.rechargeWay}, #{recharge.rechargeTime}, #{recharge.rechargeVoucher}, #{recharge.adminId}, #{recharge.remark}, 1)",
"</foreach>"
"<foreach collection='list' item='item' separator=','>",
"(#{item.jwcode}, #{item.orderCode}, #{item.activityId}, #{item.paidGold}, #{item.freeGold}, #{item.rechargeGold}, #{item.payWay}, #{item.rechargeWay}, #{item.rechargeTime}, #{item.rechargeVoucher}, #{item.adminId}, #{item.remark}, 1)",
"</foreach>",
"</script>"
})
@Options(useGeneratedKeys = true, keyColumn = "recharge_id", keyProperty = "rechargeId")
int insertBatch(List<Recharge> list);
@Options(useGeneratedKeys = false)
int insertBatch(@Param("list") List<Recharge> list);
@Update({
"<script>",

222
src/main/java/com/example/demo/security/TokenFilter.java

@ -118,94 +118,18 @@
// filterChain.doFilter(requestWrapper, response); // 注意这里使用requestWrapper
// }
//}
package com.example.demo.security;
import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.RequestWrapper;
import com.example.demo.Util.TokenPayload;
import com.example.demo.domain.entity.Admin;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.io.InputStream;
@Component
public class TokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 检查是否是上传请求
boolean isUploadRequest = request.getRequestURI().startsWith("/upload");
System.out.println(request.getRequestURI());
System.out.println(isUploadRequest);
if (isUploadRequest) {
// 如果是上传请求直接将请求传递给下一个过滤器或目标资源
filterChain.doFilter(request, response);
return;
} else {
// 使用RequestWrapper包装原始的HttpServletRequest使其输入流可以被重复读取
RequestWrapper requestWrapper = new RequestWrapper(request);
System.out.println(request);
// 确保请求体只被读取一次
boolean hasRequestBody = "POST".equals(requestWrapper.getMethod());
if (hasRequestBody) {
// 获取输入流
InputStream inputStream = requestWrapper.getInputStream();
// 使用Jackson ObjectMapper解析JSON
ObjectMapper objectMapper = new ObjectMapper();
TokenPayload tokenPayload = objectMapper.readValue(inputStream, TokenPayload.class);
// 检查tokenPayload中是否存在token属性并且这个属性不为空
String token = tokenPayload.getToken();
if (StringUtils.hasText(token)) {
try {
UserDetails userDetails = JWTUtil.getUserDetailsList(token, Admin.class);
if (!ObjectUtils.isEmpty(userDetails)) {
// 将这个用户注册到Security中
UsernamePasswordAuthenticationToken authenticationToken
= new UsernamePasswordAuthenticationToken(
userDetails, null,
userDetails.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(requestWrapper));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
} catch (Exception e) {
e.printStackTrace();
// Token无效可以在这里添加相应的处理逻辑例如返回401状态码等
}
}
}
// 非上传请求继续执行过滤器链
filterChain.doFilter(requestWrapper, response);
}
}
}
//package com.example.demo.security;
//
//import com.example.demo.Util.JWTUtil;
//import com.example.demo.Util.RequestWrapper;
//import com.example.demo.Util.TokenPayload;
//import com.example.demo.domain.entity.Admin;
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.core.type.TypeReference;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import jakarta.servlet.FilterChain;
//import jakarta.servlet.ServletException;
//import jakarta.servlet.http.HttpServletRequest;
//import jakarta.servlet.http.HttpServletResponse;
//import org.springframework.core.annotation.Order;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.security.core.userdetails.UserDetails;
@ -214,16 +138,12 @@ public class TokenFilter extends OncePerRequestFilter {
//import org.springframework.util.ObjectUtils;
//import org.springframework.util.StringUtils;
//import org.springframework.web.filter.OncePerRequestFilter;
//
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.List;
//
//@Component
//public class TokenFilter extends OncePerRequestFilter {
//
// private final ObjectMapper objectMapper = new ObjectMapper();
//
// @Override
// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
// throws ServletException, IOException {
@ -244,39 +164,10 @@ public class TokenFilter extends OncePerRequestFilter {
// if (hasRequestBody) {
// // 获取输入流
// InputStream inputStream = requestWrapper.getInputStream();
// // 使用Jackson ObjectMapper解析JSON
// ObjectMapper objectMapper = new ObjectMapper();
// TokenPayload tokenPayload = objectMapper.readValue(inputStream, TokenPayload.class);
//
// // 检查Content-Type是否为application/json并且请求体不为空
// String contentType = request.getContentType();
// if (contentType != null && contentType.startsWith("application/json") && inputStream.available() > 0) {
// // 尝试反序列化JSON
// try {
// // 尝试将输入流转换为字符串以检查是否为数组
// String json = objectMapper.readTree(inputStream).toString();
// if (json.startsWith("[")) {
// // JSON是数组
// TypeReference<List<TokenPayload>> typeRef = new TypeReference<List<TokenPayload>>() {};
// List<TokenPayload> tokenPayloads = objectMapper.readValue(json, typeRef);
// // 处理tokenPayloads列表
// for (TokenPayload tokenPayload : tokenPayloads) {
// processTokenPayload(tokenPayload, requestWrapper);
// }
// } else {
// // JSON是单个对象
// TokenPayload tokenPayload = objectMapper.readValue(json, TokenPayload.class);
// processTokenPayload(tokenPayload, requestWrapper);
// }
// } catch (JsonProcessingException e) {
// e.printStackTrace();
// // JSON解析失败可以在这里添加相应的处理逻辑例如返回400状态码等
// }
// }
// }
// // 非上传请求继续执行过滤器链
// filterChain.doFilter(requestWrapper, response);
// }
// }
//
// private void processTokenPayload(TokenPayload tokenPayload, HttpServletRequest request) {
// // 检查tokenPayload中是否存在token属性并且这个属性不为空
// String token = tokenPayload.getToken();
// if (StringUtils.hasText(token)) {
@ -288,7 +179,7 @@ public class TokenFilter extends OncePerRequestFilter {
// = new UsernamePasswordAuthenticationToken(
// userDetails, null,
// userDetails.getAuthorities());
// authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
// authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(requestWrapper));
// SecurityContextHolder.getContext().setAuthentication(authenticationToken);
// }
// } catch (Exception e) {
@ -297,4 +188,107 @@ public class TokenFilter extends OncePerRequestFilter {
// }
// }
// }
// // 非上传请求继续执行过滤器链
// filterChain.doFilter(requestWrapper, response);
// }
// }
//}
package com.example.demo.security;
import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.RequestWrapper;
import com.example.demo.Util.TokenPayload;
import com.example.demo.domain.entity.Admin;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
@Component
public class TokenFilter extends OncePerRequestFilter {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 检查是否是上传请求
boolean isUploadRequest = request.getRequestURI().startsWith("/upload");
System.out.println(request.getRequestURI());
System.out.println(isUploadRequest);
if (isUploadRequest) {
// 如果是上传请求直接将请求传递给下一个过滤器或目标资源
filterChain.doFilter(request, response);
return;
} else {
// 使用RequestWrapper包装原始的HttpServletRequest使其输入流可以被重复读取
RequestWrapper requestWrapper = new RequestWrapper(request);
System.out.println(request);
// 确保请求体只被读取一次
boolean hasRequestBody = "POST".equals(requestWrapper.getMethod());
if (hasRequestBody) {
// 获取输入流
InputStream inputStream = requestWrapper.getInputStream();
try {
// 尝试将输入流转换为Map<String, Object>
Map<String, Object> jsonMap = objectMapper.readValue(inputStream, new TypeReference<Map<String, Object>>() {});
// 提取并处理token字段
String token = (String) jsonMap.get("token");
if (StringUtils.hasText(token)) {
processToken(token, requestWrapper);
}
// 处理其他字段如recharge列表
// 这里可以根据需要进一步解析其他字段
} catch (JsonProcessingException e) {
e.printStackTrace();
// JSON解析失败可以在这里添加相应的处理逻辑例如返回400状态码等
}
}
// 非上传请求继续执行过滤器链
filterChain.doFilter(requestWrapper, response);
}
}
private void processToken(String token, HttpServletRequest request) {
if (StringUtils.hasText(token)) {
try {
UserDetails userDetails = JWTUtil.getUserDetailsList(token, Admin.class);
if (!ObjectUtils.isEmpty(userDetails)) {
// 将这个用户注册到Security中
UsernamePasswordAuthenticationToken authenticationToken
= new UsernamePasswordAuthenticationToken(
userDetails, null,
userDetails.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
} catch (Exception e) {
e.printStackTrace();
// Token无效可以在这里添加相应的处理逻辑例如返回401状态码等
}
}
}
}

5
src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java

@ -192,8 +192,9 @@ public class RechargeServiceImpl implements RechargeService {
@Override
public Result addRecharges(List<Recharge> recharges) {
try {
// 这里可以添加具体的批量添加逻辑例如调用 DAO 层的方法进行批量插入
rechargeMapper.insertBatch(recharges);
for (Recharge recharge : recharges) {
add(recharge); // 调用add方法处理每个Recharge对象
}
return Result.success("批量添加成功");
} catch (Exception e) {
return Result.error("批量添加失败: " + e.getMessage());

1
src/main/resources/application.yml

@ -8,6 +8,7 @@ spring:
max-request-size: 100MB
datasource:
hikari: # HikariCP连接池配置
maximum-pool-size: 10 # 最大连接数
minimum-idle: 5 # 最小空闲连接数
idle-timeout: 30000 # 空闲连接超时时间(毫秒)

Loading…
Cancel
Save