From 34b88e0885351dd7e7c81ee88be456540d56ebf0 Mon Sep 17 00:00:00 2001 From: hly <2783385703@qq.com> Date: Wed, 27 Aug 2025 10:52:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contoller/ApiAppletAddressController.java | 12 +- .../contoller/ApiAppletAmountController.java | 11 +- .../applet/contoller/ApiAppletLoginController.java | 13 +- .../applet/contoller/ApiAppletOrderController.java | 17 +- .../contoller/ApiAppletServiceLogController.java | 8 +- .../contoller/ApiAppletUserTeacherController.java | 16 +- .../applet/contoller/ApiMallOrderController.java | 10 +- .../applet/contoller/H5AppointmentController.java | 2 +- .../ruoyi/applet/service/IApiMallOrderService.java | 2 +- .../service/impl/IApiMallOrderServiceImpl.java | 22 +- .../com/ruoyi/applet/utils/AppletTokenUtils.java | 266 +++++++++++++++++++++ .../model/service/impl/AppUsersServiceImpl.java | 2 +- .../java/com/ruoyi/common/enums/OrderStatus.java | 1 + .../ruoyi/common/utils/README_AppletTokenUtils.md | 189 +++++++++++++++ .../com/cyl/manager/oms/mapper/OrderMapper.java | 4 +- 15 files changed, 524 insertions(+), 51 deletions(-) create mode 100644 ruoyi-catdog/src/main/java/com/ruoyi/applet/utils/AppletTokenUtils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/README_AppletTokenUtils.md diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAddressController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAddressController.java index 0536c19..b50f572 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAddressController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAddressController.java @@ -1,13 +1,13 @@ package com.ruoyi.applet.contoller; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.applet.utils.AppletTokenUtils; import com.ruoyi.model.domain.AppletAddress; import com.ruoyi.model.domain.AppletOutDate; import com.ruoyi.model.service.IAppletAddressService; import com.ruoyi.model.service.IAppletOutDateService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -26,10 +26,12 @@ public class ApiAppletAddressController { @ApiOperation("地址-地址列表数据查询") @GetMapping("/addressList") - public AjaxResult outDateList(AppletAddress appletAddress){ - if(appletAddress.getUserId() == null){ - return AjaxResult.error("用户标识不能为空"); - } + public AjaxResult outDateList(){ + // 使用AppletTokenUtils工具类从请求头中获取当前用户ID + Long currentUserId = AppletTokenUtils.requireCurrentAppletUserId(); + + AppletAddress appletAddress = new AppletAddress(); + appletAddress.setUserId(currentUserId); List addressList = appletAddressService.selectAppletAddressList(appletAddress); if(addressList.size()>0){ //如果地址信息不为空则循环设置不接单日期 diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAmountController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAmountController.java index 58d3989..dcab7d5 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAmountController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAmountController.java @@ -1,20 +1,16 @@ package com.ruoyi.applet.contoller; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.ruoyi.applet.transfer.TransferToUser; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.applet.utils.AppletTokenUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.model.domain.AppUsers; import com.ruoyi.model.domain.AppletAmountLog; -import com.ruoyi.model.domain.AppletConfig; import com.ruoyi.model.service.IAppUsersService; import com.ruoyi.model.service.IAppletAmountLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.map.HashedMap; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; @@ -37,10 +33,13 @@ public class ApiAppletAmountController { @ApiOperation("小程序-金额流水信息列表数据查询") @GetMapping("/amountLogList") public AjaxResult amountLogList(AppletAmountLog appletAmountLog){ + // 使用AppletTokenUtils工具类从请求头中获取当前用户ID + Long currentUserId = AppletTokenUtils.requireCurrentAppletUserId(); + List amountLogList = appletAmountLogService .lambdaQuery() .orderByDesc(AppletAmountLog::getCreateTime) - .eq(AppletAmountLog::getUserId, appletAmountLog.getUserId()) + .eq(AppletAmountLog::getUserId, currentUserId) .eq(appletAmountLog.getType() != null, AppletAmountLog::getType, appletAmountLog.getType()) .eq(appletAmountLog.getMoneyType() != null, AppletAmountLog::getMoneyType, appletAmountLog.getMoneyType()) .list(); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletLoginController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletLoginController.java index 3b21538..6c084a8 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletLoginController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletLoginController.java @@ -2,6 +2,7 @@ package com.ruoyi.applet.contoller; import com.ruoyi.applet.pojo.dto.ApiAppletLoginDTO; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.applet.utils.AppletTokenUtils; import com.ruoyi.model.service.IAApiAppletLoginService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -47,6 +48,16 @@ public class ApiAppletLoginController { @ApiOperation("伴宠师-获取用户基本能信息") @GetMapping("/getAppletUserInfo/{appUserId}") public AjaxResult getAppletUserInfo(@PathVariable("appUserId") Long appUserId){ - return apiAppletLoginService.getAppletUserInfo(appUserId); + Long currentUserId = AppletTokenUtils.requireCurrentAppletUserId(); + return apiAppletLoginService.getAppletUserInfo(currentUserId); + } + + //伴宠师-获取当前登录用户信息(使用工具类) + @ApiOperation("伴宠师-获取当前登录用户信息") + @GetMapping("/getCurrentUserInfo") + public AjaxResult getCurrentUserInfo(){ + // 使用AppletTokenUtils工具类从请求头中获取当前用户ID + Long currentUserId = AppletTokenUtils.requireCurrentAppletUserId(); + return apiAppletLoginService.getAppletUserInfo(currentUserId); } } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderController.java index 1a7c16f..b1c5674 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderController.java @@ -30,8 +30,8 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.applet.utils.AppletTokenUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.model.domain.*; import com.ruoyi.model.service.*; import com.ruoyi.model.service.impl.AppletOrderItemServiceImpl; @@ -716,9 +716,10 @@ public class ApiAppletOrderController extends BaseController { if(orderItem.getOrderStatus()==null){ return AjaxResult.error("orderStatus状态不能为空"); } - if(orderItem.getUserId() == null){ - return AjaxResult.error("userId用户信息标识不能为空"); - } + // 使用AppletTokenUtils工具类从请求头中获取当前用户ID + Long currentUserId = AppletTokenUtils.requireCurrentAppletUserId(); + orderItem.setUserId(currentUserId); + List itemList = appletOrderItemService.selectAppletOrderItemList(orderItem); // for (AppletOrderItem item:itemList){ // H5OrderVO h5OrderVO = h5OrderService.orderDetail(item.getOrderId()); @@ -877,16 +878,16 @@ public class ApiAppletOrderController extends BaseController { @ApiOperation("小程序-我的订单流程-日订单") @GetMapping("/myDateList") public AjaxResult myDateList(AppletOrderDateVo dateVo) { - if (dateVo.getUserId() == null) { - return AjaxResult.error("userId用户标识不能为空"); - } + // 使用AppletTokenUtils工具类从请求头中获取当前用户ID + Long currentUserId = AppletTokenUtils.requireCurrentAppletUserId(); + if (dateVo.getStatus() == null) { return AjaxResult.error("status当前状态不能为空"); } // 查询我所有的日订单数据 AppletOrderItemDate date = new AppletOrderItemDate(); - date.setUserId(dateVo.getUserId()); + date.setUserId(currentUserId); date.setStatus(dateVo.getStatus()); List addressList = appletOrderItemDateService.selectAppletOrderItemDateList(date); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletServiceLogController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletServiceLogController.java index cdb40e6..e502cd9 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletServiceLogController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletServiceLogController.java @@ -1,11 +1,9 @@ package com.ruoyi.applet.contoller; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.applet.utils.AppletTokenUtils; import com.ruoyi.model.domain.AppletServiceLog; -import com.ruoyi.model.domain.AppletUsersTeacher; -import com.ruoyi.model.service.IAppUsersService; import com.ruoyi.model.service.IAppletServiceLogService; -import com.ruoyi.model.service.IAppletUsersTeacherService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -24,6 +22,10 @@ public class ApiAppletServiceLogController { @ApiOperation("伴宠师工作台-服务记录列表数据查询") @GetMapping("/serviceLogList") public AjaxResult serviceLogList(AppletServiceLog serviceLog){ + // 使用AppletTokenUtils工具类从请求头中获取当前用户ID + Long currentUserId = AppletTokenUtils.requireCurrentAppletUserId(); + serviceLog.setUserId(currentUserId); + List logList = appletServiceLogService.selectAppletServiceLogList(serviceLog); return AjaxResult.success("服务记录列表数据",logList); } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletUserTeacherController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletUserTeacherController.java index 944cfb3..c496065 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletUserTeacherController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletUserTeacherController.java @@ -3,19 +3,11 @@ package com.ruoyi.applet.contoller; import com.alibaba.fastjson.JSONObject; import com.cyl.h5.pojo.request.OrderPayRequest; import com.cyl.h5.pojo.response.OrderPayResponse; -import com.cyl.manager.staff.domain.BondTransaction; -import com.cyl.manager.ums.domain.Member; -import com.cyl.wechat.WechatPayData; import com.cyl.wechat.WechatPayService; -import com.cyl.wechat.WechatPayUtil; import com.ruoyi.applet.utils.tencent.TencentUtil; -import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisService; -import com.ruoyi.common.enums.BondOrderStatus; -import com.ruoyi.common.enums.BondTransactionType; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.config.LocalDataUtil; +import com.ruoyi.applet.utils.AppletTokenUtils; import com.ruoyi.model.domain.AppUsers; import com.ruoyi.model.domain.AppletUsersTeacher; import com.ruoyi.model.service.IAppUsersService; @@ -25,12 +17,9 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; @Slf4j @Api(description = "伴宠师-伴宠师认证") @@ -60,7 +49,8 @@ public class ApiAppletUserTeacherController { @ApiOperation("伴宠师工作台-查询用户是否提交过数据") @GetMapping("/getUserOne/{appUserId}") public AjaxResult getUserOne(@PathVariable("appUserId") Long appUserId){ - AppletUsersTeacher appletUsersTeacher = appletUsersTeacherService.selectAppletUsersTeacherByUserId(appUserId); + Long currentUserId = AppletTokenUtils.requireCurrentAppletUserId(); + AppletUsersTeacher appletUsersTeacher = appletUsersTeacherService.selectAppletUsersTeacherByUserId(currentUserId); return AjaxResult.success("认证信息",appletUsersTeacher); } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java index a1c2405..322e5bf 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java @@ -95,6 +95,7 @@ public class ApiMallOrderController extends BaseController { statusList.add(1); statusList.add(2); statusList.add(3); + statusList.add(6); statusList.add(11); } else { statusList.add(status); @@ -196,7 +197,7 @@ public class ApiMallOrderController extends BaseController { try { // 先取消订单 - String cancelResult = service.orderBatchCancel(request, null); + String cancelResult = service.orderBatchCancel(request, null, 5); //TODO 短信通知 通知内容需要修改一下 @@ -204,11 +205,10 @@ public class ApiMallOrderController extends BaseController { .eq(AppletOrder::getOrderId, order.getId()).one(); if(appletOrder != null){ - AppUsers appUsers = appUsersService.selectAppUsersByUserId(appletOrder.getUserId()); - - AliyunSmsUtils.sendOrderUpdate(appUsers.getUserTelephone(), "取消订单", order.getId() + ""); - + if (appUsers != null){ + AliyunSmsUtils.sendOrderUpdate(appUsers.getUserTelephone(), "取消订单", order.getId() + ""); + } } AppletConfig appletConfig = appletConfigService.getByCode("admin_phone_list"); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java index fce3e85..8b69ad1 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java @@ -94,7 +94,7 @@ public class H5AppointmentController { apiMallOrderService.orderBatchCancel(CancelOrderRequest.builder() .id(form.getOrderId()) .remark("修改订单退回上一笔钱") - .build(), null); + .build(), null, 4); } //3、提交订单 diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java index e7f9218..33fa0ad 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java @@ -23,7 +23,7 @@ public interface IApiMallOrderService { //下单小程序端 - 根据订单标识取消订单 - String orderBatchCancel(CancelOrderRequest request, Long userId); + String orderBatchCancel(CancelOrderRequest request, Long userId, Integer status); //下单小程序端 - 根据订单标识去评价 diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java index 13f5122..7e7c3e4 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java @@ -41,6 +41,7 @@ import com.ruoyi.applet.utils.WechatRefundUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisService; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.IDGenerator; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -302,7 +303,7 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { //下单小程序端 - 根据订单标识取消订单 @Transactional @Override - public String orderBatchCancel(CancelOrderRequest request, Long userId) { + public String orderBatchCancel(CancelOrderRequest request, Long userId, Integer status) { // LocalDateTime optDate = LocalDateTime.now(); // if (CollectionUtil.isEmpty(request.getIdList())){ // throw new RuntimeException("未指定需要取消的订单号"); @@ -361,9 +362,17 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { Order order = orderMapper.selectById(request.getId()); + if (order == null){ + throw new ServiceException("订单不存在"); + } + Integer oldOrderStatus = order.getStatus(); - orderMapper.cancelBatchOne(request.getId()); + if (oldOrderStatus > 0){ + String refundResult = applyWechatRefund(order, request.getRemark()); + } + + orderMapper.cancelBatchOne(request.getId(), 6); if (oldOrderStatus == 0){ return ""; @@ -390,8 +399,6 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { appletOrderDateFrequencyService.remove(Wrappers.lambdaQuery() .eq(AppletOrderDateFrequency::getOrderId, order.getId())); - String refundResult = applyWechatRefund(order, request.getRemark()); - return "取消订单成功"; } @@ -405,6 +412,7 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { // 构建退款请求 WechatRefundUtil.RefundRequest refundRequest = new WechatRefundUtil.RefundRequest(); + // 设置退款参数 refundRequest.out_trade_no = String.valueOf(order.getPayId()); // 商户订单号 refundRequest.out_refund_no = "REFUND_" + System.currentTimeMillis(); // 商户退款单号 out_refund_no @@ -429,7 +437,11 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { WechatRefundUtil.RefundResponse refundResponse = wechatRefundUtil.applyRefund(refundRequest); // 记录退款历史 - recordRefundHistory(order, refundResponse, reason); + try { +// recordRefundHistory(order, refundResponse, reason); + }catch (Exception e){ + log.error(e.getMessage()); + } return "退款申请成功,退款单号:" + refundResponse.outRefundNo; } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/utils/AppletTokenUtils.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/utils/AppletTokenUtils.java new file mode 100644 index 0000000..0fdf339 --- /dev/null +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/utils/AppletTokenUtils.java @@ -0,0 +1,266 @@ +package com.ruoyi.applet.utils; + +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.model.LoginApplet; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.model.domain.AppUsers; +import com.ruoyi.model.service.IAppUsersService; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; + +/** + * 伴宠师小程序Token解析工具类 + * 提供从HTTP请求头中获取token并解析成伴宠师用户信息的功能 + * + * @author ruoyi + */ +@Component +public class AppletTokenUtils { + + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + // 令牌秘钥 + @Value("${token.secret}") + private String secret; + + private static RedisCache redisCache; + + private static IAppUsersService appUsersService; + + static { + redisCache = SpringUtils.getBean(RedisCache.class); + appUsersService = SpringUtils.getBean(IAppUsersService.class); + } + + /** + * 从当前HTTP请求中获取伴宠师用户ID + * 这是最常用的方法,用于获取当前登录的伴宠师用户ID + * + * @return 伴宠师用户ID,如果未登录或token无效则返回null + */ + public static Long getCurrentAppletUserId() { + try { + LoginApplet loginApplet = getCurrentLoginApplet(); + return loginApplet != null ? loginApplet.getAppletId() : null; + } catch (Exception e) { + return null; + } + } + + /** + * 从当前HTTP请求中获取伴宠师用户ID(强制要求) + * 如果获取失败会抛出异常 + * + * @return 伴宠师用户ID + * @throws ServiceException 当获取失败时抛出 + */ + public static Long requireCurrentAppletUserId() { + Long userId = getCurrentAppletUserId(); + if (userId == null) { + throw new ServiceException("请先登录", HttpStatus.UNAUTHORIZED.value()); + } + AppUsers users = appUsersService.getById(userId); + if (users == null) { + throw new ServiceException("请重新登录", HttpStatus.UNAUTHORIZED.value()); + } + return userId; + } + + /** + * 从当前HTTP请求中获取伴宠师登录信息 + * + * @return LoginApplet对象,包含用户ID、token、登录时间等信息 + */ + public static LoginApplet getCurrentLoginApplet() { + try { + HttpServletRequest request = ServletUtils.getRequest(); + return getLoginAppletFromRequest(request); + } catch (Exception e) { + return null; + } + } + + /** + * 从指定的HTTP请求中获取伴宠师登录信息 + * + * @param request HTTP请求对象 + * @return LoginApplet对象 + */ + public static LoginApplet getLoginAppletFromRequest(HttpServletRequest request) { + if (request == null) { + return null; + } + + // 获取请求携带的令牌 + String token = extractTokenFromRequest(request); + if (StringUtils.isEmpty(token)) { + return null; + } + + try { + AppletTokenUtils instance = SpringUtils.getBean(AppletTokenUtils.class); + Claims claims = instance.parseToken(token); + + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_APPLET_KEY); + if (StringUtils.isEmpty(uuid)) { + return null; + } + + String userKey = Constants.LOGIN_APPLET_TOKEN_KEY + uuid; + return redisCache.getCacheObject(userKey); + } catch (Exception e) { + // 记录日志但不抛出异常,返回null让调用方处理 + return null; + } + } + + /** + * 验证当前请求是否包含有效的伴宠师token + * + * @return true表示有效,false表示无效 + */ + public static boolean hasValidAppletToken() { + try { + LoginApplet loginApplet = getCurrentLoginApplet(); + return loginApplet != null && loginApplet.getAppletId() != null; + } catch (Exception e) { + return false; + } + } + + /** + * 验证指定请求是否包含有效的伴宠师token + * + * @param request HTTP请求对象 + * @return true表示有效,false表示无效 + */ + public static boolean hasValidAppletToken(HttpServletRequest request) { + try { + LoginApplet loginApplet = getLoginAppletFromRequest(request); + return loginApplet != null && loginApplet.getAppletId() != null; + } catch (Exception e) { + return false; + } + } + + /** + * 从HTTP请求中提取token字符串 + * + * @param request HTTP请求对象 + * @return token字符串,如果不存在则返回null + */ + private static String extractTokenFromRequest(HttpServletRequest request) { + try { + AppletTokenUtils instance = SpringUtils.getBean(AppletTokenUtils.class); + String token = request.getHeader(instance.header); + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + return token; + } catch (Exception e) { + return null; + } + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + * @throws Exception 解析失败时抛出 + */ + private Claims parseToken(String token) throws Exception { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } + + /** + * 检查当前用户是否为指定用户 + * + * @param userId 要检查的用户ID + * @return true表示是当前用户,false表示不是 + */ + public static boolean isCurrentUser(Long userId) { + if (userId == null) { + return false; + } + Long currentUserId = getCurrentAppletUserId(); + return userId.equals(currentUserId); + } + + /** + * 要求当前请求必须包含有效的伴宠师token,否则抛出异常 + * + * @throws ServiceException 当token无效时抛出 + */ + public static void requireValidAppletToken() { + if (!hasValidAppletToken()) { + throw new ServiceException("请先登录", HttpStatus.UNAUTHORIZED.value()); + } + } + + /** + * 要求当前用户必须是指定用户,否则抛出异常 + * + * @param userId 要求的用户ID + * @throws ServiceException 当用户不匹配时抛出 + */ + public static void requireCurrentUser(Long userId) { + requireValidAppletToken(); + if (!isCurrentUser(userId)) { + throw new ServiceException("无权限访问", HttpStatus.FORBIDDEN.value()); + } + } + + /** + * 获取当前登录用户的token字符串 + * + * @return token字符串,如果未登录则返回null + */ + public static String getCurrentToken() { + try { + HttpServletRequest request = ServletUtils.getRequest(); + return extractTokenFromRequest(request); + } catch (Exception e) { + return null; + } + } + + /** + * 检查token是否即将过期(剩余时间少于指定分钟数) + * + * @param minutes 检查的分钟数阈值 + * @return true表示即将过期,false表示还有足够时间 + */ + public static boolean isTokenExpiringSoon(int minutes) { + try { + LoginApplet loginApplet = getCurrentLoginApplet(); + if (loginApplet == null || loginApplet.getExpireTime() == null) { + return true; + } + + long currentTime = System.currentTimeMillis(); + long expireTime = loginApplet.getExpireTime(); + long remainingTime = expireTime - currentTime; + long thresholdTime = minutes * 60 * 1000L; // 转换为毫秒 + + return remainingTime < thresholdTime; + } catch (Exception e) { + return true; + } + } +} \ No newline at end of file diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java index fb2c50d..7917665 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java @@ -100,7 +100,7 @@ public class AppUsersServiceImpl extends ServiceImpl i public int updateAppUsers(AppUsers appUsers) { appUsers.setUpdateTime(DateUtils.getNowDate()); - return appUsersMapper.updateById(appUsers); + return appUsersMapper.updateAppUsers(appUsers); } /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/OrderStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OrderStatus.java index 987d541..c54341a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/OrderStatus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/OrderStatus.java @@ -14,6 +14,7 @@ public enum OrderStatus COMPLETE(3, "已完成"), CLOSED(4, "已关闭"), INVALID(5, "无效订单"), + CANCEL(6, "取消订单"), REFUUND(-2, "售后订单"), UNDERWAY(11, "进行中"); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/README_AppletTokenUtils.md b/ruoyi-common/src/main/java/com/ruoyi/common/utils/README_AppletTokenUtils.md new file mode 100644 index 0000000..3c684b9 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/README_AppletTokenUtils.md @@ -0,0 +1,189 @@ +# AppletTokenUtils 工具类使用说明 + +## 概述 + +`AppletTokenUtils` 是一个专门用于处理伴宠师小程序用户token解析的工具类。它可以从HTTP请求头中获取token并解析成伴宠师用户信息,提供了多种便捷的方法来获取当前登录用户的信息。 + +## 主要功能 + +1. **从请求头获取token并解析用户信息** +2. **验证token有效性** +3. **获取当前登录用户ID** +4. **权限验证和用户身份检查** +5. **token过期检查** + +## 常用方法 + +### 1. 获取当前用户ID + +```java +// 获取当前登录的伴宠师用户ID(可能返回null) +Long userId = AppletTokenUtils.getCurrentAppletUserId(); + +// 获取当前登录的伴宠师用户ID(强制要求,失败会抛异常) +Long userId = AppletTokenUtils.requireCurrentAppletUserId(); +``` + +### 2. 验证token有效性 + +```java +// 检查当前请求是否包含有效token +boolean isValid = AppletTokenUtils.hasValidAppletToken(); + +// 要求当前请求必须包含有效token,否则抛异常 +AppletTokenUtils.requireValidAppletToken(); +``` + +### 3. 获取登录信息 + +```java +// 获取当前登录的伴宠师详细信息 +LoginApplet loginApplet = AppletTokenUtils.getCurrentLoginApplet(); +if (loginApplet != null) { + Long userId = loginApplet.getAppletId(); + String token = loginApplet.getToken(); + Long loginTime = loginApplet.getLoginTime(); + Long expireTime = loginApplet.getExpireTime(); +} +``` + +### 4. 用户身份验证 + +```java +// 检查当前用户是否为指定用户 +boolean isCurrentUser = AppletTokenUtils.isCurrentUser(userId); + +// 要求当前用户必须是指定用户,否则抛异常 +AppletTokenUtils.requireCurrentUser(userId); +``` + +### 5. Token过期检查 + +```java +// 检查token是否在30分钟内过期 +boolean expiringSoon = AppletTokenUtils.isTokenExpiringSoon(30); +``` + +## 在控制器中的使用示例 + +### 示例1:获取当前用户信息 + +```java +@RestController +@RequestMapping("/applet/user") +public class AppletUserController { + + @Autowired + private IAppUsersService appUsersService; + + @GetMapping("/profile") + public AjaxResult getUserProfile() { + // 获取当前登录用户ID + Long userId = AppletTokenUtils.requireCurrentAppletUserId(); + + // 根据用户ID获取用户详细信息 + AppUsers user = appUsersService.selectAppUsersByUserId(userId); + + return AjaxResult.success("用户信息", user); + } +} +``` + +### 示例2:用户权限验证 + +```java +@PutMapping("/updateProfile") +public AjaxResult updateProfile(@RequestBody AppUsers appUsers) { + // 验证当前用户只能修改自己的信息 + AppletTokenUtils.requireCurrentUser(appUsers.getUserId()); + + // 执行更新操作 + int result = appUsersService.updateAppUsers(appUsers); + + return result > 0 ? AjaxResult.success() : AjaxResult.error("更新失败"); +} +``` + +### 示例3:可选的用户验证 + +```java +@GetMapping("/publicInfo") +public AjaxResult getPublicInfo() { + // 检查是否有有效token(不强制要求) + if (AppletTokenUtils.hasValidAppletToken()) { + Long userId = AppletTokenUtils.getCurrentAppletUserId(); + // 返回个性化信息 + return AjaxResult.success("个性化信息", getPersonalizedInfo(userId)); + } else { + // 返回公共信息 + return AjaxResult.success("公共信息", getPublicInfo()); + } +} +``` + +### 示例4:在Service层中使用 + +```java +@Service +public class AppletOrderServiceImpl implements IAppletOrderService { + + @Override + public List getCurrentUserOrders() { + // 在Service层也可以使用工具类获取当前用户 + Long userId = AppletTokenUtils.requireCurrentAppletUserId(); + return orderMapper.selectOrdersByUserId(userId); + } + + @Override + public AjaxResult createOrder(Order order) { + // 自动设置订单的用户ID为当前登录用户 + Long userId = AppletTokenUtils.requireCurrentAppletUserId(); + order.setUserId(userId); + + // 执行创建订单逻辑 + return orderMapper.insertOrder(order); + } +} +``` + +## 异常处理 + +工具类会抛出以下异常: + +- `ServiceException("请先登录", HttpStatus.UNAUTHORIZED)` - 当token无效或不存在时 +- `ServiceException("无权限访问", HttpStatus.FORBIDDEN)` - 当用户身份验证失败时 + +建议在全局异常处理器中统一处理这些异常: + +```java +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(ServiceException.class) + public AjaxResult handleServiceException(ServiceException e) { + return AjaxResult.error(e.getCode(), e.getMessage()); + } +} +``` + +## 注意事项 + +1. **线程安全**:工具类是线程安全的,可以在多线程环境中使用 +2. **性能考虑**:工具类会从Redis缓存中获取用户信息,性能较好 +3. **异常处理**:使用`require*`方法时要做好异常处理 +4. **空值检查**:使用非`require*`方法时要检查返回值是否为null +5. **配置依赖**:确保`token.header`和`token.secret`配置正确 + +## 配置要求 + +在`application.yml`中需要配置: + +```yaml +token: + header: Authorization # token在请求头中的字段名 + secret: your-secret-key # JWT签名密钥 +``` + +## 与现有代码的兼容性 + +这个工具类与现有的`TokenService`完全兼容,可以逐步替换原有的token解析逻辑,提高代码的简洁性和可维护性。 \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java b/ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java index f31b325..7532d8a 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java @@ -49,8 +49,8 @@ public interface OrderMapper extends BaseMapper { //修改订单状态为已取消 - @Update("update oms_order set status = 4 where id = #{orderId}") - Integer cancelBatchOne(@Param("orderId") Long orderId); + @Update("update oms_order set status = #{status} where id = #{orderId}") + Integer cancelBatchOne(@Param("orderId") Long orderId,@Param("status") Integer status); MemberDataStatisticsVO statOrderCountAndAmount(Long memberId);