浏览代码

mall-api增加拦截器

gqx 2 年之前
父节点
当前提交
baa29426d2

+ 6 - 1
jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java

@@ -1,5 +1,6 @@
 package org.jeecg.config.shiro;
 
+import com.alibaba.druid.support.json.JSONUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
@@ -14,6 +15,7 @@ import org.crazycake.shiro.RedisCacheManager;
 import org.crazycake.shiro.RedisClusterManager;
 import org.crazycake.shiro.RedisManager;
 import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.util.SpringContextUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.config.JeecgBaseConfig;
 import org.jeecg.config.shiro.filters.CustomShiroFilterFactoryBean;
@@ -130,7 +132,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/jmreport/**", "anon");
         filterChainDefinitionMap.put("/**/*.js.map", "anon");
         filterChainDefinitionMap.put("/**/*.css.map", "anon");
-        
+
         //大屏模板例子
         filterChainDefinitionMap.put("/test/bigScreen/**", "anon");
         filterChainDefinitionMap.put("/bigscreen/template1/**", "anon");
@@ -151,6 +153,8 @@ public class ShiroConfig {
         //测试模块排除
         filterChainDefinitionMap.put("/test/seata/**", "anon");
 
+        filterChainDefinitionMap.put("/mall-api/**", "anon");
+
         // 添加自己的过滤器并且取名为jwt
         Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
         //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】
@@ -160,6 +164,7 @@ public class ShiroConfig {
         // <!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边
         filterChainDefinitionMap.put("/**", "jwt");
 
+
         // 未授权界面返回JSON
         shiroFilterFactoryBean.setUnauthorizedUrl("/sys/common/403");
         shiroFilterFactoryBean.setLoginUrl("/sys/common/403");

+ 8 - 0
jeecg-mall-api/pom.xml

@@ -36,6 +36,14 @@
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-open</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.jeecgframework.boot</groupId>
+            <artifactId>jeecg-system-biz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 24 - 0
jeecg-mall-api/src/main/java/annotation/ApiLogin.java

@@ -0,0 +1,24 @@
+package annotation;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 加上此注解,接口必须登录带session才能访问
+ * @author
+ */
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ApiLogin {
+	/**
+	 * 必须登录才能访问,默认true
+	 * @return
+	 */
+	boolean mustLogin() default true;
+
+}

+ 62 - 0
jeecg-mall-api/src/main/java/config/WebConfig.java

@@ -0,0 +1,62 @@
+package config;
+
+import interceptor.ThirdSessionInterceptor;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.config.sign.interceptor.SignAuthInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.config.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * web配置
+ */
+//@EnableWebMvc
+@Configuration
+//@Component
+@Slf4j
+public class WebConfig implements WebMvcConfigurer {
+//	public class WebConfig extends WebMvcConfigurerAdapter {
+//public class WebConfig extends WebMvcConfigurationSupport {
+//	@Resource
+//	private RedisUtil redisUtil;
+
+	@Bean
+	public ThirdSessionInterceptor thirdSessionInterceptor() {
+		return new ThirdSessionInterceptor();
+	}
+
+//	@Resource
+//	private ThirdSessionInterceptor thirdSessionInterceptor;
+	/**
+	 * 拦截器
+	 * @param registry
+	 */
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		log.info("拦截器---------------");
+		/**
+		 * 进入ThirdSession拦截器
+		 */
+//		registry.addInterceptor(thirdSessionInterceptor()).addPathPatterns("/**");
+//				//放行接口
+////				.excludePathPatterns("/mall-api/wxuser/ma-login2");//小程序登录
+////		registry.addInterceptor(thirdSessionInterceptor());
+//		super.addInterceptors(registry);
+//		registry.addInterceptor(thirdSessionInterceptor());
+//		super.addInterceptors(registry);
+//		registry.addInterceptor(new ThirdSessionInterceptor()).addPathPatterns("/**");
+
+		registry
+				.addInterceptor(thirdSessionInterceptor())
+				.addPathPatterns("/mall-api/**")   //拦截路径
+                .excludePathPatterns("/mall-api/wxuser/ma-login");     //不拦截路径
+		WebMvcConfigurer.super.addInterceptors(registry);
+
+	}
+}

+ 123 - 0
jeecg-mall-api/src/main/java/interceptor/ThirdSessionInterceptor.java

@@ -0,0 +1,123 @@
+package interceptor;
+
+import annotation.ApiLogin;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.druid.support.json.JSONUtils;
+import com.util.ThirdSessionHolder;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authc.AuthenticationException;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.exception.JeecgBoot401Exception;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.TenantContextHolder;
+import org.jeecg.modules.wxuser.entity.ThirdSession;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * ThirdSession拦截器,校验每个请求的ThirdSession
+ * @author
+ */
+@Slf4j
+//@AllArgsConstructor
+@Component
+public class ThirdSessionInterceptor implements HandlerInterceptor {
+//public class ThirdSessionInterceptor extends HandlerInterceptorAdapter {
+//	private final RedisTemplate redisTemplate;
+
+	@Resource
+	private RedisUtil redisUtil;
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		HandlerMethod method = (HandlerMethod) handler;
+		//判断访问的control是否添加ApiLogin注解
+		ApiLogin apiLogin = method.getMethodAnnotation(ApiLogin.class);
+		String appIdHeader = request.getHeader("app-id");
+		//小程序端的所有接口需要登录才能访问,校验thirdSession
+		return this.judeSession(request, response, apiLogin);
+	}
+
+	/**
+	 * 校验session
+	 * @param request
+	 * @param response
+	 * @return
+	 * @throws IOException
+	 */
+	private boolean judeSession(HttpServletRequest request, HttpServletResponse response, ApiLogin apiLogin) throws IOException {
+		//获取header中的ThirdSession
+		String thirdSessionHeader = request.getHeader("third-session");
+		if (StrUtil.isNotBlank(thirdSessionHeader)) {
+			//获取缓存中的ThirdSession
+			String key = CommonConstant.PREFIX_WX_APP_USER_TOKEN + thirdSessionHeader;
+			Object thirdSessionObj = redisUtil.get(key);
+			if (thirdSessionObj == null) {//session过期
+				ThirdSessionHolder.clear();
+				this.writerPrint(response, "登录超时,请重新登录");
+				return Boolean.FALSE;
+			} else {
+				String thirdSessionStr = String.valueOf(thirdSessionObj);
+				ThirdSession thirdSession = JSONUtil.toBean(thirdSessionStr, ThirdSession.class);
+				//判断session是否属于当前tenantId、appId
+				String tenantIdHeader = request.getHeader("tenant-id");
+				if (StrUtil.isNotBlank(tenantIdHeader) && !thirdSession.getTenantId().equals(tenantIdHeader)) {
+					this.writerPrint(response, "登录超时,请重新登录");
+					return Boolean.FALSE;
+				}
+				String appIdHeader = request.getHeader("app-id");
+				if (StrUtil.isNotBlank(appIdHeader) && StrUtil.isNotBlank(thirdSession.getAppId()) && !thirdSession.getAppId().equals(appIdHeader)) {
+					this.writerPrint(response, "登录超时,请重新登录");
+					return Boolean.FALSE;
+				}
+				redisUtil.expire(key, JwtUtil.EXPIRE_TIME * 24 * 30 / 1000);//更新session过期时间
+				TenantContextHolder.setTenantId(thirdSession.getTenantId());//设置租户ID
+				ThirdSessionHolder.setThirdSession(thirdSession);//设置thirdSession
+
+				if (apiLogin != null && apiLogin.mustLogin()) {
+					//此接口必须登录商城才能访问
+					this.judeSessionUserMall(response, thirdSession);
+				}
+				return Boolean.TRUE;
+			}
+		} else {
+			this.writerPrint(response, "session不能为空");
+			return Boolean.FALSE;
+		}
+	}
+
+	/**
+	 * 校验session是否商城登录
+	 * @param thirdSession
+	 * @return
+	 * @throws IOException
+	 */
+	private boolean judeSessionUserMall(HttpServletResponse response, ThirdSession thirdSession) throws IOException {
+		String userId = thirdSession.getUserId();
+		if(StrUtil.isBlank(userId)){
+			this.writerPrint(response, "请先登录");
+			return Boolean.FALSE;
+		}
+		return Boolean.TRUE;
+	}
+
+	private void writerPrint(HttpServletResponse response, String msg) throws IOException {
+		//返回401错误码,触发小程序重新登录
+		JwtUtil.responseError(response,401,msg);
+	}
+}

+ 69 - 0
jeecg-mall-api/src/main/java/org/jeecg/modules/business/controller/BusHotelController.java

@@ -0,0 +1,69 @@
+package org.jeecg.modules.business.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.util.JwtUtil;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TenantContextHolder;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.business.entity.BusHotel;
+import org.jeecg.modules.business.service.IBusHotelService;
+import org.jeecg.modules.business.util.MapUtil;
+import org.jeecg.modules.system.entity.SysTenant;
+import org.jeecg.modules.system.service.ISysTenantService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 酒店列表
+ */
+@Api(tags="酒店列表")
+@RestController
+@RequestMapping("/mall-api/busHotel")
+@Slf4j
+public class BusHotelController extends JeecgController<BusHotel, IBusHotelService> {
+   @Autowired
+   private IBusHotelService busHotelService;
+
+    /**
+     * 列表查询
+     *
+     * @param busHotel
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "bus_hotel-列表查询")
+    @ApiOperation(value="bus_hotel-列表查询", notes="bus_hotel-列表查询")
+    @GetMapping(value = "/queryList")
+    public Result<List<BusHotel>> queryList(BusHotel busHotel, HttpServletRequest req) {
+        QueryWrapper<BusHotel> queryWrapper = QueryGenerator.initQueryWrapper(busHotel, req.getParameterMap());
+        String tenantId = TenantContextHolder.getTenantId();
+        if (StringUtils.isNotBlank(tenantId)) {
+            queryWrapper.eq("tenant_id", tenantId);
+        }
+        queryWrapper.eq("status", 1);
+        queryWrapper.eq("check_status", 1);
+        queryWrapper.eq("del_flag", 0);
+        List<BusHotel> list = busHotelService.list(queryWrapper);
+        return Result.OK(list);
+    }
+}

+ 138 - 0
jeecg-mall-api/src/main/java/org/jeecg/modules/business/controller/BusMemberCardController.java

@@ -0,0 +1,138 @@
+package org.jeecg.modules.business.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.util.ThirdSessionHolder;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TenantContextHolder;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.business.dto.UserGroupDto;
+import org.jeecg.modules.business.dto.UserLabelDto;
+import org.jeecg.modules.business.entity.*;
+import org.jeecg.modules.business.service.*;
+import org.jeecg.modules.business.vo.MemberCardStatVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Description: 会员卡
+ * @Author: jeecg-boot
+ */
+@Api(tags="会员卡")
+@RestController
+@RequestMapping("/mall-api/busMemberCard")
+@Slf4j
+public class BusMemberCardController extends JeecgController<BusMemberCard, IBusMemberCardService> {
+	@Autowired
+	private IBusMemberCardService busMemberCardService;
+	 @Autowired
+	 private IBusHotelService busHotelService;
+	 @Autowired
+	 private IBusMarketMemberService busMarketMemberService;
+	 @Autowired
+	 private IBusMarketMemberGroupService busMarketMemberGroupService;
+	 @Autowired
+	 private IBusMarketMemberLableService busMarketMemberLableService;
+	/**
+	 * 购买会员卡分页列表查询
+	 *
+	 * @param busMemberCard
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "bus_member_card-分页列表查询")
+	@ApiOperation(value="bus_member_card-分页列表查询", notes="bus_member_card-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BusMemberCard>> queryPageList(BusMemberCard busMemberCard,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		String tenantId = TenantContextHolder.getTenantId();
+		String userId = ThirdSessionHolder.getUserId();
+		if (StringUtils.isBlank(userId)) {
+			return Result.error("请先用手机号登录");
+		}
+		LambdaQueryWrapper<BusMemberCard> queryWrapper = QueryGenerator.initQueryWrapper(busMemberCard, req.getParameterMap()).lambda();
+		queryWrapper.eq(BusMemberCard::getUserId,userId);
+		queryWrapper.eq(BusMemberCard::getTenantId,tenantId);
+		Page<BusMemberCard> page = new Page<BusMemberCard>(pageNo, pageSize);
+		IPage<BusMemberCard> pageList = busMemberCardService.page(page, queryWrapper);
+		pageList.getRecords().forEach(item -> {
+			BusHotel hotle = busHotelService.getById(item.getHotelId());
+			if (hotle != null) {
+				item.setHotelName(hotle.getName());
+			}
+			BusMarketMember busMarketMember = busMarketMemberService.getById(item.getGradeId());
+			if (busMarketMember != null) {
+				item.setGradeName(busMarketMember.getName());
+			}
+			if (ObjectUtils.isNotEmpty(item.getGroupId())) {
+				BusMarketMemberGroup busMarketMemberGroup = busMarketMemberGroupService.getById(item.getGroupId());
+				if (busMarketMemberGroup != null) {
+					item.setGroupName(busMarketMemberGroup.getName());
+				}
+			}
+			if (ObjectUtils.isNotEmpty(item.getLabelId())) {
+				BusMarketMemberLable busMarketMemberLable = busMarketMemberLableService.getById(item.getLabelId());
+				if (busMarketMemberLable != null) {
+					item.setLabelName(busMarketMemberLable.getName());
+				}
+			}
+		});
+		return Result.OK(pageList);
+	}
+
+
+
+	/**
+	 *   添加会员卡
+	 *
+	 * @param busMemberCard
+	 * @return
+	 */
+	@AutoLog(value = "添加会员卡")
+	@ApiOperation(value="添加会员卡", notes="添加会员卡")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody BusMemberCard busMemberCard) {
+		String tenantId = TenantContextHolder.getTenantId();
+		String userId = ThirdSessionHolder.getUserId();
+		if (StringUtils.isBlank(userId)) {
+			return Result.error("请先用手机号登录");
+		}
+		LambdaQueryWrapper<BusMemberCard> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BusMemberCard::getTenantId, tenantId);
+		queryWrapper.eq(BusMemberCard::getUserId, userId);
+//		queryWrapper.eq(BusMemberCard::getMobile, busMemberCard.getMobile());
+		queryWrapper.eq(BusMemberCard::getHotelId, busMemberCard.getHotelId());
+		Long count = busMemberCardService.count(queryWrapper);
+		if (count > 0) {
+			return Result.error("该账号已绑定会员卡!");
+		}
+		busMemberCard.setUserId(userId);
+		busMemberCardService.save(busMemberCard);
+		return Result.OK("添加成功!");
+	}
+
+
+}

+ 56 - 0
jeecg-mall-api/src/main/java/org/jeecg/modules/business/controller/BusParamXcxRoomController.java

@@ -0,0 +1,56 @@
+package org.jeecg.modules.business.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.business.entity.BusParamXcxRoom;
+import org.jeecg.modules.business.service.IBusParamXcxRoomService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+
+/**
+ * 小程序客房服务
+ */
+@Api(tags="小程序客房服务")
+@RestController
+@RequestMapping("/mall-api/busParamXcxRoom")
+@Slf4j
+public class BusParamXcxRoomController extends JeecgController<BusParamXcxRoom, IBusParamXcxRoomService> {
+   @Autowired
+   private IBusParamXcxRoomService busParamXcxRoomService;
+
+    /**
+     * 通过hotelId查询
+     *
+     * @param hotelId
+     * @return
+     */
+    @ApiOperation(value="小程序客房服务设置-通过hotelId查询", notes="小程序客房服务设置-通过hotelId查询")
+    @GetMapping(value = "/queryByHotelId")
+    public Result<BusParamXcxRoom> queryByHotelId(@RequestParam(name="hotelId") String hotelId) {
+        if (StringUtils.isBlank(hotelId)) {
+            return Result.error("暂未入住酒店");
+        }
+        QueryWrapper<BusParamXcxRoom> queryWrapper = new QueryWrapper<BusParamXcxRoom>();
+        queryWrapper.eq("hotel_id", hotelId);
+        BusParamXcxRoom resultModel = busParamXcxRoomService.getOne(queryWrapper);
+        return Result.OK(resultModel);
+    }
+}

+ 7 - 1
jeecg-mall-api/src/main/java/org/jeecg/modules/wxuser/controller/WxUserController.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.wxuser.controller;
 
+import annotation.ApiLogin;
 import cn.binarywang.wx.miniapp.api.WxMaUserService;
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import com.alibaba.fastjson.JSON;
@@ -9,7 +10,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.util.ThirdSessionHolder;
+import config.WebConfig;
 import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ObjectUtils;
@@ -25,7 +28,9 @@ import org.jeecg.modules.wxuser.dto.WxOpenDataDto;
 import org.jeecg.modules.wxuser.entity.ThirdSession;
 import org.jeecg.modules.wxuser.entity.UserInfo;
 import org.jeecg.modules.wxuser.service.IUserInfoService;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -40,8 +45,9 @@ import java.util.*;
  */
 @Slf4j
 @RestController
+@AllArgsConstructor
 @RequestMapping("/mall-api/wxuser")
-public class WxUserController {
+public class WxUserController extends WebConfig {
 
     @Resource
     private IUserInfoService userInfoService;

+ 4 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMemberCard.java

@@ -137,6 +137,10 @@ public class BusMemberCard implements Serializable {
     @Excel(name = "标签id", width = 15)
     @ApiModelProperty(value = "标签id")
     private String labelId;
+    /**商城用户id*/
+    @Excel(name = "商城用户id", width = 15)
+    @ApiModelProperty(value = "商城用户id")
+    private String userId;
 
 	@TableField(exist = false)
 	private String hotelName;

+ 7 - 0
pom.xml

@@ -61,6 +61,7 @@
 		<logback.version>1.2.9</logback.version>
 		<ttl.version>2.11.4</ttl.version>
 		<weixin-java.version>4.0.0</weixin-java.version>
+		<hutool.version>5.4.2</hutool.version>
 	</properties>
 
 	<modules>
@@ -363,6 +364,12 @@
 				<artifactId>weixin-java-miniapp</artifactId>
 				<version>${weixin-java.version}</version>
 			</dependency>
+			<!--hutool-->
+			<dependency>
+				<groupId>cn.hutool</groupId>
+				<artifactId>hutool-all</artifactId>
+				<version>${hutool.version}</version>
+			</dependency>
 		</dependencies>
 	</dependencyManagement>