Browse Source

在登录之后, 将店铺信息存储到redis中

gaohp 1 year ago
parent
commit
8c9981d06e
14 changed files with 238 additions and 6 deletions
  1. 2 0
      feifan-framework/feifan-spring-boot-starter-mq/pom.xml
  2. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/config/TradeConfigDO.java
  3. 31 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/ShopController.java
  4. 9 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/dal/redis/ShopMessage.java
  5. 24 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/mq/consumer/login/LoginConsumer.java
  6. 4 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantService.java
  7. 46 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantServiceImpl.java
  8. 14 1
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopService.java
  9. 38 1
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopServiceImpl.java
  10. 11 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java
  11. 17 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/message/login/LoginSendMessage.java
  12. 28 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/producer/login/LoginProducer.java
  13. 7 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/oauth2/OAuth2TokenServiceImpl.java
  14. 4 4
      feifan-server/src/main/resources/application-local.yaml

+ 2 - 0
feifan-framework/feifan-spring-boot-starter-mq/pom.xml

@@ -38,6 +38,8 @@
             <artifactId>rocketmq-spring-boot-starter</artifactId>
             <optional>true</optional>
         </dependency>
+
+
     </dependencies>
 
 </project>

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/config/TradeConfigDO.java

@@ -115,4 +115,7 @@ public class TradeConfigDO extends BaseDO {
     @TableField(typeHandler = IntegerListTypeHandler.class)
     private List<Integer> brokerageWithdrawTypes;
 
+    private Long shopId;
+
+
 }

+ 31 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/ShopController.java

@@ -1,5 +1,6 @@
 package cn.newfeifan.mall.sale.controller.admin.shop;
 
+import cn.newfeifan.mall.framework.security.core.LoginUser;
 import cn.newfeifan.mall.module.enums.ErrorCodeConstants;
 import cn.newfeifan.mall.module.system.api.user.dto.AdminUserRespDTO;
 import cn.newfeifan.mall.module.system.controller.admin.user.vo.user.UserRespVO;
@@ -8,6 +9,7 @@ import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
 import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
+import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
 import cn.newfeifan.mall.sale.service.merchant.MerchantService;
 import cn.newfeifan.mall.sale.service.shop.ShopService;
 import org.springframework.web.bind.annotation.*;
@@ -39,6 +41,7 @@ import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
 import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
 
 import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.*;
 import static cn.newfeifan.mall.module.enums.ErrorCodeConstants.MERCHANT_NOT_EXISTS;
 
 import cn.newfeifan.mall.sale.dal.dataobject.shop.ShopDO;
@@ -149,4 +152,32 @@ public class ShopController {
                 BeanUtils.toBean(list, ShopRespVO.class));
     }
 
+
+    @PutMapping("/change_shop")
+    @Operation(summary = "切换店铺")
+    @PreAuthorize("@ss.hasPermission('sale:merchant:query')")
+    public CommonResult<Boolean> changeShop(@RequestParam("shopId") Long shopId) {
+        shopService.changeShop(getLoginUserId(),shopId);
+        return success(true);
+    }
+
+
+    @PutMapping("/get_current_shop")
+    @Operation(summary = "获取当前店铺ID")
+    @PreAuthorize("@ss.hasPermission('sale:merchant:query')")
+    public CommonResult<ShopMessage> getCurrentShop() {
+        return success(shopService.getCurrentShop(getLoginUserId()));
+    }
+
+    @GetMapping("/getAllShopByUserId")
+    @Operation(summary = "获取当前用户下的所有店铺")
+    @Parameter(name = "merId", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('sale:merchant:query')")
+    public CommonResult<List<ShopRespVO>> getAllShopByUserId() {
+        // 获取所有店铺
+        List<ShopRespVO> shops = shopService.getAllShopByUserId(getLoginUserId());
+        return success(shops);
+    }
+
+
 }

+ 9 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/dal/redis/ShopMessage.java

@@ -0,0 +1,9 @@
+package cn.newfeifan.mall.sale.dal.redis;
+
+import lombok.Data;
+
+@Data
+public class ShopMessage {
+    private Long shopId;
+    private Long merId;
+}

+ 24 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/mq/consumer/login/LoginConsumer.java

@@ -0,0 +1,24 @@
+package cn.newfeifan.mall.sale.mq.consumer.login;
+
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
+import cn.newfeifan.mall.sale.service.merchant.MerchantService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class LoginConsumer {
+    @Resource
+    private MerchantService mailSendService;
+
+    @EventListener
+    @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
+    public void onMessage(LoginSendMessage message) {
+        log.info("[onMessage][消息内容({})]", message);
+        mailSendService.doSendMail(message);
+    }
+
+}

+ 4 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantService.java

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.sale.service.merchant;
 
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantRespVO;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
@@ -58,4 +59,7 @@ public interface MerchantService {
 
     List<MerchantRespVO> salesVolume(Map<Long, MerchantRespVO> map);
 
+
+    void doSendMail(LoginSendMessage message);
+
 }

+ 46 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantServiceImpl.java

@@ -1,18 +1,25 @@
 package cn.newfeifan.mall.sale.service.merchant;
 
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.module.product.service.sku.ProductSkuService;
+import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
 import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
 import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
+import cn.newfeifan.mall.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO;
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
 import cn.newfeifan.mall.module.system.service.user.AdminUserService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantRespVO;
 import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
+import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
 import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
 import cn.newfeifan.mall.sale.dal.mysql.merchant.MerchantMapper;
+import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
 import cn.newfeifan.mall.sale.service.shop.ShopService;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -27,6 +34,7 @@ import java.util.ArrayList;
 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.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -130,4 +138,42 @@ public class MerchantServiceImpl implements MerchantService {
         return new ArrayList<>(map.values());
     }
 
+    @Resource
+    private OAuth2AccessTokenRedisDAO oauth2AccessTokenRedisDAO;
+
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+
+    @Override
+    public void doSendMail(LoginSendMessage message) {
+
+        // 查询用户的商户信息,并且缓存到redis中
+        OAuth2AccessTokenDO oAuth2AccessTokenDO = message.getOAuth2AccessTokenDO();
+        ShopMessage shopMessage = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("shop:" + message.getOAuth2AccessTokenDO().getAccessToken()), ShopMessage.class);
+        if (shopMessage != null) {
+            // 刷新时间
+            stringRedisTemplate.opsForValue().set("shop:" + oAuth2AccessTokenDO.getUserId(), JsonUtils.toJsonString(shopMessage), 3600 * 24, TimeUnit.SECONDS);
+        } else {
+            // 查询数据库
+            AdminUserDO adminUserDO = userMapper.selectById(message.getOAuth2AccessTokenDO().getUserId());
+            if (adminUserDO.getShopId() != null) {
+                ShopMessage addRedis = new ShopMessage().setShopId(adminUserDO.getShopId()).setMerId(adminUserDO.getMerchantId());
+                stringRedisTemplate.opsForValue().set("shop:" + oAuth2AccessTokenDO.getUserId(), JsonUtils.toJsonString(addRedis), 3600 * 24, TimeUnit.SECONDS);
+            } else {
+                // 获取随机店铺
+                List<ShopRespVO> merchantAllShop = shopService.getMerchantAllShop(adminUserDO.getMerchantId());
+                oAuth2AccessTokenDO.setMerchantId(adminUserDO.getMerchantId());
+                Long shopId = null;
+                if (merchantAllShop.size() > 0) {
+                    shopId = merchantAllShop.get(0).getId();
+                    oAuth2AccessTokenDO.setShopId(shopId);
+                }
+                //存储redis
+                ShopMessage addRedis = new ShopMessage().setShopId(shopId).setMerId(adminUserDO.getMerchantId());
+                stringRedisTemplate.opsForValue().set("shop:" + oAuth2AccessTokenDO.getUserId(), JsonUtils.toJsonString(addRedis), 3600 * 24, TimeUnit.SECONDS);
+            }
+        }
+    }
+
 }

+ 14 - 1
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopService.java

@@ -3,13 +3,13 @@ package cn.newfeifan.mall.sale.service.shop;
 import javax.validation.*;
 
 import cn.newfeifan.mall.module.system.controller.admin.user.vo.user.UserRespVO;
-import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
 import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
 import cn.newfeifan.mall.sale.dal.dataobject.shop.ShopDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
+import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
 
 import java.util.List;
 
@@ -90,4 +90,17 @@ public interface ShopService {
      */
     List<UserRespVO> getAllUser(List<Long> shopIds);
 
+    /**
+     * 刷新
+     *
+     * @param trim
+     * @param loginUserId
+     * @param shopId
+     */
+    void changeShop(Long loginUserId, Long shopId);
+
+    ShopMessage getCurrentShop(Long loginUserId);
+
+    List<ShopRespVO> getAllShopByUserId(Long loginUserId);
+
 }

+ 38 - 1
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopServiceImpl.java

@@ -1,14 +1,19 @@
 package cn.newfeifan.mall.sale.service.shop;
 
+import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.module.system.controller.admin.user.vo.user.UserRespVO;
+import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
 import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
+import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
+import cn.newfeifan.mall.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO;
 import cn.newfeifan.mall.module.system.service.user.AdminUserService;
-import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
 import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
 import cn.newfeifan.mall.sale.dal.mysql.shop.ShopMapper;
+import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -20,6 +25,7 @@ import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -36,6 +42,8 @@ public class ShopServiceImpl implements ShopService {
 
     @Resource
     private ShopMapper shopMapper;
+    @Resource
+    private AdminUserMapper userMapper;
 
     @Override
     public Long createShop(ShopSaveReqVO createReqVO) {
@@ -119,4 +127,33 @@ public class ShopServiceImpl implements ShopService {
         return BeanUtils.toBean(userRespVO, UserRespVO.class);
     }
 
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+    @Resource
+    private OAuth2AccessTokenRedisDAO oauth2AccessTokenRedisDAO;
+
+    @Override
+    public void changeShop(Long loginUserId, Long shopId) {
+
+        AdminUserDO adminUserDO = userMapper.selectById(loginUserId);
+        ShopMessage shopMessage = new ShopMessage().setShopId(shopId).setMerId(adminUserDO.getMerchantId());
+        // 存储到redis中
+        stringRedisTemplate.opsForValue().set("shop:" + loginUserId, JsonUtils.toJsonString(shopMessage), 3600 * 24, TimeUnit.SECONDS);
+        // 更新到数据库中
+        AdminUserDO updateAdminUser = new AdminUserDO().setShopId(shopId).setId(adminUserDO.getId());
+        userMapper.updateById(updateAdminUser);
+    }
+
+    @Override
+    public ShopMessage getCurrentShop(Long loginUserId) {
+        return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("shop:" + loginUserId), ShopMessage.class);
+
+    }
+
+    @Override
+    public List<ShopRespVO> getAllShopByUserId(Long loginUserId) {
+        ShopDO shopDO = shopMapper.selectById(loginUserId);
+        return getMerchantAllShop(shopDO.getMerchantId());
+    }
+
 }

+ 11 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java

@@ -66,4 +66,15 @@ public class OAuth2AccessTokenDO extends TenantBaseDO {
      */
     private LocalDateTime expiresTime;
 
+    /**
+     * 当前用户商户
+     */
+    private Long shopId;
+
+    /**
+     * 当期用户店铺
+     */
+    private Long merchantId;
+
+
 }

+ 17 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/message/login/LoginSendMessage.java

@@ -0,0 +1,17 @@
+package cn.newfeifan.mall.module.system.mq.message.login;
+
+import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class LoginSendMessage {
+
+    /**
+     * 当前登录信息
+     */
+    @NotNull(message = "当前登录信息")
+    private OAuth2AccessTokenDO oAuth2AccessTokenDO;
+
+}

+ 28 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/mq/producer/login/LoginProducer.java

@@ -0,0 +1,28 @@
+package cn.newfeifan.mall.module.system.mq.producer.login;
+
+import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
+import cn.newfeifan.mall.module.system.mq.message.mail.MailSendMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+public class LoginProducer {
+    @Resource
+    private ApplicationContext applicationContext;
+
+    /**
+     * 发送 {@link MailSendMessage} 消息
+     *
+     * @param oAuth2AccessTokenDO 当前登录信息
+     */
+    public void sendLoginMessage(OAuth2AccessTokenDO oAuth2AccessTokenDO) {
+        LoginSendMessage message = new LoginSendMessage()
+                .setOAuth2AccessTokenDO(oAuth2AccessTokenDO);
+        applicationContext.publishEvent(message);
+    }
+}

+ 7 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/oauth2/OAuth2TokenServiceImpl.java

@@ -14,6 +14,8 @@ import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenD
 import cn.newfeifan.mall.module.system.dal.mysql.oauth2.OAuth2AccessTokenMapper;
 import cn.newfeifan.mall.module.system.dal.mysql.oauth2.OAuth2RefreshTokenMapper;
 import cn.newfeifan.mall.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO;
+import cn.newfeifan.mall.module.system.mq.producer.login.LoginProducer;
+import cn.newfeifan.mall.module.system.mq.producer.sms.SmsProducer;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -33,6 +35,9 @@ import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils
 @Service
 public class OAuth2TokenServiceImpl implements OAuth2TokenService {
 
+    @Resource
+    private LoginProducer loginProducer;
+
     @Resource
     private OAuth2AccessTokenMapper oauth2AccessTokenMapper;
     @Resource
@@ -143,6 +148,8 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
         oauth2AccessTokenMapper.insert(accessTokenDO);
         // 记录到 Redis 中
         oauth2AccessTokenRedisDAO.set(accessTokenDO);
+        // 发送消息, 更新用户的商户更店铺信息
+        loginProducer.sendLoginMessage(accessTokenDO);
         return accessTokenDO;
     }
 

+ 4 - 4
feifan-server/src/main/resources/application-local.yaml

@@ -105,10 +105,10 @@ rocketmq:
 spring:
   # RabbitMQ 配置项,对应 RabbitProperties 配置类
   rabbitmq:
-    host: 127.0.0.1 # RabbitMQ 服务的地址
-    port: 5672 # RabbitMQ 服务的端口
-    username: rabbit # RabbitMQ 服务的账号
-    password: rabbit # RabbitMQ 服务的密码
+    host: 10.0.5.229 # RabbitMQ 服务的地址
+    port: 15672 # RabbitMQ 服务的端口
+    username: guest # RabbitMQ 服务的账号
+    password: guest # RabbitMQ 服务的密码
   # Kafka 配置项,对应 KafkaProperties 配置类
   kafka:
     bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔