lutong пре 2 месеци
родитељ
комит
ae1764062a

+ 1 - 1
SSE前后端使用说明书.md

@@ -794,7 +794,7 @@ wss://your-domain/ws/cart/{tableId}  (HTTPS环境)
 
 后端已实现 `CartWebSocketProcess` 类,位于:
 ```
-shop.alien.store.config.CartWebSocketProcess
+shop.alien.dining.config.CartWebSocketProcess
 ```
 
 **主要功能:**

+ 2 - 2
alien-store/src/main/java/shop/alien/store/config/CartWebSocketProcess.java → alien-dining/src/main/java/shop/alien/dining/config/CartWebSocketProcess.java

@@ -1,4 +1,4 @@
-package shop.alien.store.config;
+package shop.alien.dining.config;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
@@ -6,9 +6,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Component;
+import shop.alien.dining.service.CartService;
 import shop.alien.entity.store.dto.AddCartItemDTO;
 import shop.alien.entity.store.dto.CartDTO;
-import shop.alien.store.service.CartService;
 
 import javax.websocket.*;
 import javax.websocket.server.PathParam;

+ 103 - 0
alien-dining/src/main/java/shop/alien/dining/config/WebSocketConfig.java

@@ -0,0 +1,103 @@
+package shop.alien.dining.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+import javax.websocket.HandshakeResponse;
+import javax.websocket.server.HandshakeRequest;
+import javax.websocket.server.ServerEndpointConfig;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * WebSocketConfig
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2024/2/29 14:40
+ */
+@Configuration
+@EnableWebSocket
+public class WebSocketConfig {
+
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+    
+    /**
+     * WebSocket配置器,用于在握手时获取IP地址和User-Agent
+     */
+    public static class WebSocketConfigurator extends ServerEndpointConfig.Configurator {
+        @Override
+        public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
+            Map<String, Object> userProperties = sec.getUserProperties();
+            Map<String, List<String>> headers = request.getHeaders();
+            
+            // 获取User-Agent
+            List<String> userAgentList = headers.get("User-Agent");
+            String userAgent = (userAgentList != null && !userAgentList.isEmpty()) ? userAgentList.get(0) : null;
+            userProperties.put("userAgent", userAgent);
+            
+            // 获取IP地址(从请求头中获取)
+            String ipAddress = getIpAddress(headers);
+            userProperties.put("ipAddress", ipAddress);
+        }
+        
+        /**
+         * 从请求头中获取客户端IP地址
+         */
+        private String getIpAddress(Map<String, List<String>> headers) {
+            String ip = null;
+            
+            // 尝试从各种请求头中获取IP
+            if (headers.containsKey("X-Forwarded-For")) {
+                List<String> xffList = headers.get("X-Forwarded-For");
+                if (xffList != null && !xffList.isEmpty()) {
+                    ip = xffList.get(0);
+                }
+            }
+            if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
+                if (headers.containsKey("Proxy-Client-IP")) {
+                    List<String> proxyList = headers.get("Proxy-Client-IP");
+                    if (proxyList != null && !proxyList.isEmpty()) {
+                        ip = proxyList.get(0);
+                    }
+                }
+            }
+            if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
+                if (headers.containsKey("WL-Proxy-Client-IP")) {
+                    List<String> wlProxyList = headers.get("WL-Proxy-Client-IP");
+                    if (wlProxyList != null && !wlProxyList.isEmpty()) {
+                        ip = wlProxyList.get(0);
+                    }
+                }
+            }
+            if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
+                if (headers.containsKey("HTTP_CLIENT_IP")) {
+                    List<String> httpClientList = headers.get("HTTP_CLIENT_IP");
+                    if (httpClientList != null && !httpClientList.isEmpty()) {
+                        ip = httpClientList.get(0);
+                    }
+                }
+            }
+            if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
+                if (headers.containsKey("HTTP_X_FORWARDED_FOR")) {
+                    List<String> httpXffList = headers.get("HTTP_X_FORWARDED_FOR");
+                    if (httpXffList != null && !httpXffList.isEmpty()) {
+                        ip = httpXffList.get(0);
+                    }
+                }
+            }
+            
+            // 如果是多级代理,取第一个IP
+            if (ip != null && ip.contains(",")) {
+                ip = ip.split(",")[0].trim();
+            }
+            
+            return ip;
+        }
+    }
+}

+ 2 - 2
alien-store/src/main/java/shop/alien/store/controller/DiningController.java → alien-dining/src/main/java/shop/alien/dining/controller/DiningController.java

@@ -1,4 +1,4 @@
-package shop.alien.store.controller;
+package shop.alien.dining.controller;
 
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
@@ -7,7 +7,7 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.vo.*;
-import shop.alien.store.service.DiningService;
+import shop.alien.dining.service.DiningService;
 import shop.alien.util.common.JwtUtil;
 
 import java.util.List;

+ 5 - 5
alien-store/src/main/java/shop/alien/store/controller/StoreOrderController.java → alien-dining/src/main/java/shop/alien/dining/controller/StoreOrderController.java

@@ -1,4 +1,4 @@
-package shop.alien.store.controller;
+package shop.alien.dining.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -19,10 +19,10 @@ import shop.alien.mapper.StoreTableMapper;
 import shop.alien.mapper.StoreInfoMapper;
 import shop.alien.entity.store.StoreTable;
 import shop.alien.entity.store.StoreInfo;
-import shop.alien.store.config.CartWebSocketProcess;
-import shop.alien.store.service.CartService;
-import shop.alien.store.service.SseService;
-import shop.alien.store.service.StoreOrderService;
+import shop.alien.dining.config.CartWebSocketProcess;
+import shop.alien.dining.service.CartService;
+import shop.alien.dining.service.SseService;
+import shop.alien.dining.service.StoreOrderService;
 import shop.alien.util.common.JwtUtil;
 
 import javax.validation.Valid;

+ 1 - 2
alien-store/src/main/java/shop/alien/store/service/CartService.java → alien-dining/src/main/java/shop/alien/dining/service/CartService.java

@@ -1,8 +1,7 @@
-package shop.alien.store.service;
+package shop.alien.dining.service;
 
 import shop.alien.entity.store.dto.AddCartItemDTO;
 import shop.alien.entity.store.dto.CartDTO;
-import shop.alien.entity.store.dto.CartItemDTO;
 
 /**
  * 购物车服务接口

+ 1 - 2
alien-store/src/main/java/shop/alien/store/service/DiningService.java → alien-dining/src/main/java/shop/alien/dining/service/DiningService.java

@@ -1,7 +1,6 @@
-package shop.alien.store.service;
+package shop.alien.dining.service;
 
 import shop.alien.entity.store.vo.*;
-import shop.alien.entity.store.dto.CartDTO;
 
 import java.util.List;
 

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/SseService.java → alien-dining/src/main/java/shop/alien/dining/service/SseService.java

@@ -1,4 +1,4 @@
-package shop.alien.store.service;
+package shop.alien.dining.service;
 
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/StoreOrderService.java → alien-dining/src/main/java/shop/alien/dining/service/StoreOrderService.java

@@ -1,4 +1,4 @@
-package shop.alien.store.service;
+package shop.alien.dining.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

+ 3 - 3
alien-store/src/main/java/shop/alien/store/service/impl/CartServiceImpl.java → alien-dining/src/main/java/shop/alien/dining/service/impl/CartServiceImpl.java

@@ -1,4 +1,4 @@
-package shop.alien.store.service.impl;
+package shop.alien.dining.service.impl;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
@@ -18,8 +18,8 @@ import shop.alien.mapper.StoreCartMapper;
 import shop.alien.mapper.StoreCouponUsageMapper;
 import shop.alien.mapper.StoreCuisineMapper;
 import shop.alien.mapper.StoreTableMapper;
-import shop.alien.store.config.BaseRedisService;
-import shop.alien.store.service.CartService;
+import shop.alien.dining.config.BaseRedisService;
+import shop.alien.dining.service.CartService;
 import shop.alien.util.common.JwtUtil;
 
 import java.math.BigDecimal;

+ 5 - 5
alien-store/src/main/java/shop/alien/store/service/impl/DiningServiceImpl.java → alien-dining/src/main/java/shop/alien/dining/service/impl/DiningServiceImpl.java

@@ -1,4 +1,4 @@
-package shop.alien.store.service.impl;
+package shop.alien.dining.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
@@ -11,9 +11,9 @@ import shop.alien.entity.store.dto.CartDTO;
 import shop.alien.entity.store.dto.CartItemDTO;
 import shop.alien.entity.store.vo.*;
 import shop.alien.mapper.*;
-import shop.alien.store.config.BaseRedisService;
-import shop.alien.store.service.CartService;
-import shop.alien.store.service.DiningService;
+import shop.alien.dining.config.BaseRedisService;
+import shop.alien.dining.service.CartService;
+import shop.alien.dining.service.DiningService;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -44,7 +44,7 @@ public class DiningServiceImpl implements DiningService {
     private final LifeDiscountCouponUserMapper lifeDiscountCouponUserMapper;
     private final CartService cartService;
     private final BaseRedisService baseRedisService;
-    private final shop.alien.store.service.StoreOrderService storeOrderService;
+    private final shop.alien.dining.service.StoreOrderService storeOrderService;
     private final shop.alien.mapper.StoreOrderMapper storeOrderMapper;
 
     @Override

+ 2 - 2
alien-store/src/main/java/shop/alien/store/service/impl/SseServiceImpl.java → alien-dining/src/main/java/shop/alien/dining/service/impl/SseServiceImpl.java

@@ -1,4 +1,4 @@
-package shop.alien.store.service.impl;
+package shop.alien.dining.service.impl;
 
 import com.alibaba.fastjson2.JSON;
 import lombok.extern.slf4j.Slf4j;
@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
  */
 @Slf4j
 @Service
-public class SseServiceImpl implements shop.alien.store.service.SseService {
+public class SseServiceImpl implements shop.alien.dining.service.SseService {
 
     // 存储每个桌号的SSE连接,一个桌号可以有多个连接(多个用户)
     private final ConcurrentHashMap<Integer, ConcurrentHashMap<String, SseEmitter>> connections = new ConcurrentHashMap<>();

+ 3 - 3
alien-store/src/main/java/shop/alien/store/service/impl/StoreOrderServiceImpl.java → alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java

@@ -1,4 +1,4 @@
-package shop.alien.store.service.impl;
+package shop.alien.dining.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,8 +13,8 @@ import shop.alien.entity.store.*;
 import shop.alien.entity.store.dto.CartDTO;
 import shop.alien.entity.store.dto.CreateOrderDTO;
 import shop.alien.mapper.*;
-import shop.alien.store.service.CartService;
-import shop.alien.store.service.StoreOrderService;
+import shop.alien.dining.service.CartService;
+import shop.alien.dining.service.StoreOrderService;
 import shop.alien.util.common.JwtUtil;
 
 import java.math.BigDecimal;