Browse Source

修复bug

master
前端-胡立永 2 months ago
parent
commit
34b88e0885
15 changed files with 524 additions and 51 deletions
  1. +7
    -5
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAddressController.java
  2. +5
    -6
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAmountController.java
  3. +12
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletLoginController.java
  4. +9
    -8
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderController.java
  5. +5
    -3
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletServiceLogController.java
  6. +3
    -13
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletUserTeacherController.java
  7. +5
    -5
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java
  8. +1
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java
  9. +1
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java
  10. +17
    -5
      ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java
  11. +266
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/utils/AppletTokenUtils.java
  12. +1
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java
  13. +1
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/enums/OrderStatus.java
  14. +189
    -0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/README_AppletTokenUtils.md
  15. +2
    -2
      ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java

+ 7
- 5
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAddressController.java View File

@ -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<AppletAddress> addressList = appletAddressService.selectAppletAddressList(appletAddress);
if(addressList.size()>0){
//如果地址信息不为空则循环设置不接单日期


+ 5
- 6
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletAmountController.java View File

@ -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<AppletAmountLog> 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();


+ 12
- 1
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletLoginController.java View File

@ -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);
}
}

+ 9
- 8
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderController.java View File

@ -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<AppletOrderItem> 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<AppletOrderItemDate> addressList = appletOrderItemDateService.selectAppletOrderItemDateList(date);


+ 5
- 3
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletServiceLogController.java View File

@ -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<AppletServiceLog> logList = appletServiceLogService.selectAppletServiceLogList(serviceLog);
return AjaxResult.success("服务记录列表数据",logList);
}


+ 3
- 13
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletUserTeacherController.java View File

@ -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);
}


+ 5
- 5
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java View File

@ -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");


+ 1
- 1
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java View File

@ -94,7 +94,7 @@ public class H5AppointmentController {
apiMallOrderService.orderBatchCancel(CancelOrderRequest.builder()
.id(form.getOrderId())
.remark("修改订单退回上一笔钱")
.build(), null);
.build(), null, 4);
}
//3提交订单


+ 1
- 1
ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java View File

@ -23,7 +23,7 @@ public interface IApiMallOrderService {
//下单小程序端 - 根据订单标识取消订单
String orderBatchCancel(CancelOrderRequest request, Long userId);
String orderBatchCancel(CancelOrderRequest request, Long userId, Integer status);
//下单小程序端 - 根据订单标识去评价


+ 17
- 5
ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java View File

@ -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.<AppletOrderDateFrequency>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;
}


+ 266
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/utils/AppletTokenUtils.java View File

@ -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对象包含用户IDtoken登录时间等信息
*/
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;
}
}
}

+ 1
- 1
ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java View File

@ -100,7 +100,7 @@ public class AppUsersServiceImpl extends ServiceImpl<AppUsersMapper, AppUsers> i
public int updateAppUsers(AppUsers appUsers)
{
appUsers.setUpdateTime(DateUtils.getNowDate());
return appUsersMapper.updateById(appUsers);
return appUsersMapper.updateAppUsers(appUsers);
}
/**


+ 1
- 0
ruoyi-common/src/main/java/com/ruoyi/common/enums/OrderStatus.java View File

@ -14,6 +14,7 @@ public enum OrderStatus
COMPLETE(3, "已完成"),
CLOSED(4, "已关闭"),
INVALID(5, "无效订单"),
CANCEL(6, "取消订单"),
REFUUND(-2, "售后订单"),
UNDERWAY(11, "进行中");


+ 189
- 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/README_AppletTokenUtils.md View File

@ -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<Order> 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解析逻辑,提高代码的简洁性和可维护性。

+ 2
- 2
ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java View File

@ -49,8 +49,8 @@ public interface OrderMapper extends BaseMapper<Order> {
//修改订单状态为已取消
@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);


Loading…
Cancel
Save