From 2cd8d3a7e547d0911c27f1d21de2abd32a76e96d Mon Sep 17 00:00:00 2001 From: seesaw Date: Fri, 18 Oct 2024 14:00:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao-module-member-biz/pom.xml | 13 ++ .../admin/business/vo/BusinessRespVO.java | 6 + .../app/store/AppStoreController.java | 26 +++ .../app/store/dto/StoreOrderDto.java | 2 + .../app/user/AppMemberUserController.java | 6 + .../service/business/BusinessServiceImpl.java | 154 ++++++++++-------- .../service/storeorder/StoreOrderService.java | 2 + .../storeorder/StoreOrderServiceImpl.java | 16 ++ .../service/user/MemberUserService.java | 1 + .../service/user/MemberUserServiceImpl.java | 26 +++ .../module/member/util/QRCodeWithJWTUtil.java | 66 ++++++++ 11 files changed, 250 insertions(+), 68 deletions(-) create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/QRCodeWithJWTUtil.java diff --git a/yudao-module-member/yudao-module-member-biz/pom.xml b/yudao-module-member/yudao-module-member-biz/pom.xml index 5ea21262..8a299144 100644 --- a/yudao-module-member/yudao-module-member-biz/pom.xml +++ b/yudao-module-member/yudao-module-member-biz/pom.xml @@ -94,6 +94,19 @@ yudao-spring-boot-starter-websocket + + + com.google.zxing + core + 3.4.1 + + + com.google.zxing + javase + 3.4.1 + + + diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/business/vo/BusinessRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/business/vo/BusinessRespVO.java index 3e8e80a1..344b8a9d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/business/vo/BusinessRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/business/vo/BusinessRespVO.java @@ -75,4 +75,10 @@ public class BusinessRespVO { private BigDecimal reduce; private String time; + + private BigDecimal turnoverCompare; + + private int orderSumCompare; + + private BigDecimal priceAvgCompare; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/AppStoreController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/AppStoreController.java index 14369354..a705bc60 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/AppStoreController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/AppStoreController.java @@ -173,6 +173,27 @@ public class AppStoreController { return JsonUtils.toJsonString(StoreResult.success(null)); } + + + @PostMapping("/mgcr/order/payByCodeOrder") + @Operation(summary = "添加二维码订单") + public String payByCodeOrder(@RequestBody StoreOrderDto dto) { + + String s = orderService.cardPay(dto); + + if("true".equals(s)){ + return JsonUtils.toJsonString(StoreResult.success(null)); + } else if ("false".equals(s)) { + return JsonUtils.toJsonString(StoreResult.fail("余额不足")); + }else { + return JsonUtils.toJsonString(StoreResult.fail(s)); + } + } + + + + + public String reverseHexAndConvert(String hexStr) { // 将十六进制字符串反转,每两位一组 StringBuilder reversedHex = new StringBuilder(); @@ -191,4 +212,9 @@ public class AppStoreController { return decimalStr; } + + + + + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/dto/StoreOrderDto.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/dto/StoreOrderDto.java index d7593c64..f8b65877 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/dto/StoreOrderDto.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/dto/StoreOrderDto.java @@ -6,4 +6,6 @@ import lombok.Data; public class StoreOrderDto extends StoreSaleGoodsDto{ private String cardNumber; + + private String jwt; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java index 858fbd97..bfe43ef1 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java @@ -151,5 +151,11 @@ public class AppMemberUserController { public CommonResult> getInfoByCard(String cardId,Long mobile){ return success(userService.getInfoByCard(cardId,mobile)); } + + @GetMapping("/getQRCode") + @Operation(summary = "获取消费二维码") + public CommonResult getQRCode(){ + return success(userService.getQRCode()); + } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/business/BusinessServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/business/BusinessServiceImpl.java index d2021671..6e7019b8 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/business/BusinessServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/business/BusinessServiceImpl.java @@ -104,60 +104,63 @@ public class BusinessServiceImpl implements BusinessService { } @Override - public synchronized void updateStatistics(StatisticsVo vo) { - // 获取今天的开始时间 - LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); - // 获取今天的结束时间 (23:59:59.999) - LocalDateTime endOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MAX); + public void updateStatistics(StatisticsVo vo) { + synchronized(vo.getCarteenId()){ + // 获取今天的开始时间 + LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); + // 获取今天的结束时间 (23:59:59.999) + LocalDateTime endOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MAX); - List businessDOS = businessMapper.selectList(Wrappers.lambdaQuery() - .between(BusinessDO::getCreateTime, startOfDay, endOfDay) - .eq(BusinessDO::getCarteenId, vo.getCarteenId())); - if (CollectionUtil.isNotEmpty(businessDOS)) { - BusinessDO businessDO = businessDOS.get(0); + List businessDOS = businessMapper.selectList(Wrappers.lambdaQuery() + .between(BusinessDO::getCreateTime, startOfDay, endOfDay) + .eq(BusinessDO::getCarteenId, vo.getCarteenId())); + if (CollectionUtil.isNotEmpty(businessDOS)) { + BusinessDO businessDO = businessDOS.get(0); - //重量 - if(ObjectUtil.isNotEmpty(vo.getOrderId())){ - List orderDetailDOS = orderDetailMapper.selectList(Wrappers.lambdaQuery().eq(OrderDetailDO::getOrderId, vo.getOrderId())); - if (CollectionUtil.isNotEmpty(orderDetailDOS)) { - BigDecimal reduce = orderDetailDOS.stream().map(OrderDetailDO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); - businessDO.setWeigh(businessDO.getWeigh().add(reduce)); + //重量 + if(ObjectUtil.isNotEmpty(vo.getOrderId())){ + List orderDetailDOS = orderDetailMapper.selectList(Wrappers.lambdaQuery().eq(OrderDetailDO::getOrderId, vo.getOrderId())); + if (CollectionUtil.isNotEmpty(orderDetailDOS)) { + BigDecimal reduce = orderDetailDOS.stream().map(OrderDetailDO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); + businessDO.setWeigh(businessDO.getWeigh().add(reduce)); + } } - } - //订单数 - businessDO.setOrderSum(businessDO.getOrderSum() + vo.getOrder_sum()); + //订单数 + businessDO.setOrderSum(businessDO.getOrderSum() + vo.getOrder_sum()); - //营业额 - if(ObjectUtil.isNotEmpty(vo.getTotalMoney())){ - businessDO.setTurnover(businessDO.getTurnover().add(vo.getTotalMoney())); - } - - //客单价 - if(businessDO.getOrderSum() != 0){ - businessDO.setPriceAvg(businessDO.getTurnover().divide(new BigDecimal(businessDO.getOrderSum()), 2, RoundingMode.HALF_UP)); - } - - //减免金额 - if(ObjectUtil.isNotEmpty(vo.getReduceMoney())){ - businessDO.setReduce(businessDO.getReduce().add(vo.getReduceMoney())); - } - - //早中晚金额 - if(ObjectUtil.isNotEmpty(vo.getTime())){ - String timePeriod = TimePeriodEnum.getTimePeriod(vo.getTime()); - - if(timePeriod.equals(CostTypeEnum.MORNING.getCode())){ - businessDO.setBreakfast(businessDO.getBreakfast().add(vo.getTotalMoney())); - }else if (timePeriod.equals(CostTypeEnum.NOON.getCode())){ - businessDO.setLunch(businessDO.getLunch().add(vo.getTotalMoney())); - }else if (timePeriod.equals(CostTypeEnum.NIGHT.getCode())){ - businessDO.setDinner(businessDO.getDinner().add(vo.getTotalMoney())); + //营业额 + if(ObjectUtil.isNotEmpty(vo.getTotalMoney())){ + businessDO.setTurnover(businessDO.getTurnover().add(vo.getTotalMoney())); } - } - businessMapper.updateById(businessDO); + //客单价 + if(businessDO.getOrderSum() != 0){ + businessDO.setPriceAvg(businessDO.getTurnover().divide(new BigDecimal(businessDO.getOrderSum()), 2, RoundingMode.HALF_UP)); + } + + //减免金额 + if(ObjectUtil.isNotEmpty(vo.getReduceMoney())){ + businessDO.setReduce(businessDO.getReduce().add(vo.getReduceMoney())); + } + + //早中晚金额 + if(ObjectUtil.isNotEmpty(vo.getTime())){ + String timePeriod = TimePeriodEnum.getTimePeriod(vo.getTime()); + + if(timePeriod.equals(CostTypeEnum.MORNING.getCode())){ + businessDO.setBreakfast(businessDO.getBreakfast().add(vo.getTotalMoney())); + }else if (timePeriod.equals(CostTypeEnum.NOON.getCode())){ + businessDO.setLunch(businessDO.getLunch().add(vo.getTotalMoney())); + }else if (timePeriod.equals(CostTypeEnum.NIGHT.getCode())){ + businessDO.setDinner(businessDO.getDinner().add(vo.getTotalMoney())); + } + } + + businessMapper.updateById(businessDO); + } } + } @Override @@ -188,25 +191,6 @@ public class BusinessServiceImpl implements BusinessService { // 获取当月的总天数 int daysInMonth = yearMonth.lengthOfMonth(); - // 定义一个格式化器,格式为 "dd"(两位数的日期) - DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("dd"); - - // 循环遍历该月的每一天 - for (int day = 1; day <= daysInMonth; day++) { - if(map.get(day) == null){ - BusinessRespVO bean = new BusinessRespVO(); - bean.setTurnover(BigDecimal.ZERO).setOrderSum(0).setReduce(BigDecimal.ZERO).setWeigh(BigDecimal.ZERO) - .setBreakfast(BigDecimal.ZERO).setLunch(BigDecimal.ZERO).setDinner(BigDecimal.ZERO) - .setTime(String.valueOf(day)); - monthData.put(day,bean); - }else { - BusinessRespVO bean = BeanUtils.toBean(map.get(day), BusinessRespVO.class); - bean.setTime(String.valueOf(day)); - monthData.put(day,bean); - } - - } - //获取上一个月最后一天的数据 // 获取上一个月的最后一天 YearMonth previousMonth = yearMonth.minusMonths(1); @@ -230,7 +214,27 @@ public class BusinessServiceImpl implements BusinessService { .setBreakfast(BigDecimal.ZERO).setLunch(BigDecimal.ZERO).setDinner(BigDecimal.ZERO); } - businessDataVO.setOld(old); + // 循环遍历该月的每一天 + for (int day = 1; day <= daysInMonth; day++) { + BusinessRespVO bean = new BusinessRespVO(); + if(map.get(day) == null){ + bean.setTurnover(BigDecimal.ZERO).setOrderSum(0).setReduce(BigDecimal.ZERO).setWeigh(BigDecimal.ZERO) + .setBreakfast(BigDecimal.ZERO).setLunch(BigDecimal.ZERO).setDinner(BigDecimal.ZERO) + .setTime(String.valueOf(day)); + }else { + bean = BeanUtils.toBean(map.get(day), BusinessRespVO.class); + bean.setTime(String.valueOf(day)); + } + //计算差额 + if(day == 1){ + compare(bean,old); + }else { + compare(bean,monthData.get(day-1)); + } + monthData.put(day,bean); + + } + businessDataVO.setBusinessList(new ArrayList<>(monthData.values())); return businessDataVO; } @@ -289,7 +293,7 @@ public class BusinessServiceImpl implements BusinessService { List businessDOS = businessMapper.selectList(wrapper); Map map = new HashMap<>(); - + //时间处理 for (int i = 1; i <= 12; i++) { BusinessRespVO bean = new BusinessRespVO(); bean.setTurnover(BigDecimal.ZERO).setOrderSum(0).setReduce(BigDecimal.ZERO).setWeigh(BigDecimal.ZERO) @@ -297,6 +301,7 @@ public class BusinessServiceImpl implements BusinessService { .setTime(String.valueOf(i)); map.put(i,bean); } + //数据统计 for (BusinessDO businessDO : businessDOS) { LocalDate date = businessDO.getCreateTime().toLocalDate(); @@ -320,8 +325,15 @@ public class BusinessServiceImpl implements BusinessService { for (BusinessDO businessDO : previousList) { handleBusiness(businessDO,previousVO); } + //差额统计 + for (int i = 1; i <= 12; i++) { + if(i == 1){ + compare(map.get(i),previousVO); + }else { + compare(map.get(i),map.get(i-1)); + } + } - businessDataVO.setOld(previousVO); businessDataVO.setBusinessList(new ArrayList<>(map.values())); return businessDataVO; @@ -349,4 +361,10 @@ public class BusinessServiceImpl implements BusinessService { businessRespVO.setCarteenId(businessDO.getCarteenId()); } + void compare(BusinessRespVO today, BusinessRespVO last) { + today.setTurnoverCompare(today.getTurnover().subtract(last.getTurnover())); + today.setOrderSumCompare(today.getOrderSum()-last.getOrderSum()); + today.setPriceAvgCompare(today.getPriceAvg().subtract(last.getPriceAvg())); + } + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java index 3b07db00..92d582c6 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java @@ -62,5 +62,7 @@ public interface StoreOrderService { String cardPay(StoreOrderDto dto); + String codePay(StoreOrderDto dto); + void batchCacheOrder(StoreOrderUploadDto dto); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java index a74c2d0f..800d82ac 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.service.storeorder; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO; @@ -35,6 +36,7 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_ORDER_NOT_EXISTS; +import static cn.iocoder.yudao.module.member.util.QRCodeWithJWTUtil.validateJWT; /** * 商品订单 Service 实现类 @@ -154,6 +156,20 @@ public class StoreOrderServiceImpl implements StoreOrderService { } } + @Override + public String codePay(StoreOrderDto dto) { + String s = validateJWT(dto.getJwt()); + if (StrUtil.isBlank(s)) { + return "false"; + } + + + + + + return ""; + } + @Override public void batchCacheOrder(StoreOrderUploadDto dto) { for (StoreLocalOrderDto orderDto :dto.getMgcrCacheOrderVoList()){ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java index 442f81f9..3e2e0302 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java @@ -259,4 +259,5 @@ public interface MemberUserService { boolean delete(Long userId); + String getQRCode(); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index 70ec6279..9a81c04a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -51,6 +51,7 @@ import cn.iocoder.yudao.module.member.service.orderdetail.OrderDetailService; import cn.iocoder.yudao.module.member.service.tag.MemberTagService; import cn.iocoder.yudao.module.member.service.userexpand.UserExpandService; import cn.iocoder.yudao.module.member.util.MemberConstants; +import cn.iocoder.yudao.module.member.util.QRCodeWithJWTUtil; import cn.iocoder.yudao.module.system.api.dishesnutrition.DishesNutritionApi; import cn.iocoder.yudao.module.system.api.dishesnutrition.dto.DishesNutritionRespDTO; import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; @@ -63,6 +64,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -83,12 +85,16 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.setLoginUser; import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.member.util.QRCodeWithJWTUtil.generateJWT; +import static cn.iocoder.yudao.module.member.util.QRCodeWithJWTUtil.validateJWT; /** * 会员 User Service 实现类 @@ -140,6 +146,9 @@ public class MemberUserServiceImpl implements MemberUserService { @Resource private MemberTagService memberTagService; + @Resource + private StringRedisTemplate memberUserRedisTemplate; + @Override public MemberUserDO getUserByMobile(String mobile) { @@ -897,4 +906,21 @@ public class MemberUserServiceImpl implements MemberUserService { memberUserMapper.deleteFace(userId); return i>0; } + + @Override + public String getQRCode() { + Long userId = getLoginUserId(); + String redisKey = QRCodeWithJWTUtil.QR_PREFIX+userId; + String url = memberUserRedisTemplate.opsForValue().get(redisKey); + if(StrUtil.isNotEmpty(url)){ + return url; + } + + String jwt = generateJWT(userId); // 1分钟后过期 + String fileName = "QRCode_" + userId + ".png"; + String path = QRCodeWithJWTUtil.BASE_PATH+fileName; + QRCodeWithJWTUtil.generateQRCode(jwt, 350, 350, path); // 生 + memberUserRedisTemplate.opsForValue().set(redisKey,path,60, TimeUnit.SECONDS); + return path; + } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/QRCodeWithJWTUtil.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/QRCodeWithJWTUtil.java new file mode 100644 index 00000000..202d0058 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/QRCodeWithJWTUtil.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.member.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; + +import cn.hutool.jwt.JWTUtil; + + +import java.io.File; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + + +public class QRCodeWithJWTUtil { + private static final String SECRET_KEY = "your_secret_key"; // 使用HS256算法生成秘钥 + public static final String BASE_PATH = "qrCodes/"; + public static final String QR_PREFIX = "QRCODE_"; +// public static void main(String[] args) throws WriterException, IOException { +// // 用户ID +// Long userId = 123L; +// +// // 生成包含JWT的二维码 +// String jwt = generateJWT(userId, 1); // 1分钟后过期 +// String fileName = "QRCode_" + userId + ".png"; +// generateQRCode(jwt, 350, 350, BASE_PATH+fileName); // 生成二维码并保存 +// } + + // 生成 JWT + public static String generateJWT(Long userId) { + // 创建 JWT payload + Map payload = new HashMap<>(); + payload.put("userId", userId); + + // 设置过期时间为1分钟 + long expireTime = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(1); + payload.put("exp", expireTime); // 添加过期时间到 payload + + // 生成 JWT + + return JWTUtil.createToken(payload, SECRET_KEY.getBytes()); + } + + // 生成二维码图片 + public static void generateQRCode(String data, int width, int height, String filePath) { + QrCodeUtil.generate(data, width, height, new File(filePath)); + } + + // 验证JWT是否有效和未过期 + public static String validateJWT(String jwt) { + boolean isValid = JWTUtil.verify(jwt, SECRET_KEY.getBytes()); + if (isValid) { + System.out.println("JWT 验证成功!"); + // 解析 JWT + JSONObject payloads = JWTUtil.parseToken(jwt).getPayloads(); + Map map = JSONUtil.toBean(payloads, Map.class); + return map.get("userId").toString(); + } else { + System.out.println("JWT 验证失败!"); + } + return null; + } +}