Bladeren bron

:baby_chick: 搜索部分修改,添加zuul

nnkwrik 6 jaren geleden
bovenliggende
commit
b423c1a40a
26 gewijzigde bestanden met toevoegingen van 414 en 92 verwijderingen
  1. 26 49
      auth-service/src/main/java/io/github/nnkwrik/authservice/controller/AuthController.java
  2. 1 1
      auth-service/src/main/java/io/github/nnkwrik/authservice/dto/AuthDTO.java
  3. 3 14
      auth-service/src/main/java/io/github/nnkwrik/authservice/model/vo/AuthVo.java
  4. 3 0
      auth-service/src/main/java/io/github/nnkwrik/authservice/mq/RegisterStreamSender.java
  5. 16 0
      auth-service/src/main/java/io/github/nnkwrik/authservice/service/AuthService.java
  6. 127 0
      auth-service/src/main/java/io/github/nnkwrik/authservice/service/impl/AuthServiceImpl.java
  7. 1 1
      auth-service/src/main/java/io/github/nnkwrik/authservice/token/TokenCreator.java
  8. 43 1
      auth-service/src/test/java/io/github/nnkwrik/authservice/jwt/GenerateToken.java
  9. 1 1
      auth-service/src/test/java/io/github/nnkwrik/authservice/jwt/TestToken.java
  10. 2 2
      common/src/main/java/io/github/nnkwrik/common/dto/JWTUser.java
  11. 1 1
      common/src/main/java/io/github/nnkwrik/common/token/TokenSolver.java
  12. 3 0
      common/src/main/java/io/github/nnkwrik/common/util/JsonUtil.java
  13. 1 1
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/cache/SearchCache.java
  14. 5 4
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/controller/GoodsController.java
  15. 4 5
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/controller/SearchController.java
  16. 3 1
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/model/po/GoodsComment.java
  17. 0 1
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/model/vo/GoodsDetailPageVo.java
  18. 3 3
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/model/vo/inner/CommentVo.java
  19. 6 0
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/service/impl/GoodsServiceImpl.java
  20. 2 3
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/util/PO2VO.java
  21. 15 4
      user-service/src/main/java/io/github/nnkwrik/userservice/dao/UserMapper.java
  22. 2 0
      user-service/src/main/java/io/github/nnkwrik/userservice/mq/RegisterStreamReceiver.java
  23. 79 0
      zuul/pom.xml
  24. 13 0
      zuul/src/main/java/com/nnkwrik/zuul/ZuulApplication.java
  25. 38 0
      zuul/src/main/resources/application.yml
  26. 16 0
      zuul/src/test/java/com/nnkwrik/zuul/ZuulApplicationTests.java

+ 26 - 49
auth-service/src/main/java/io/github/nnkwrik/authservice/controller/AuthController.java

@@ -2,28 +2,23 @@ package io.github.nnkwrik.authservice.controller;
 
 import cn.binarywang.wx.miniapp.api.WxMaUserService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import io.github.nnkwrik.authservice.config.WxMaConfiguration;
 import io.github.nnkwrik.authservice.dto.AuthDTO;
 import io.github.nnkwrik.authservice.dto.DetailAuthDTO;
 import io.github.nnkwrik.authservice.model.vo.AuthVo;
 import io.github.nnkwrik.authservice.mq.RegisterStreamSender;
-import io.github.nnkwrik.authservice.token.TokenCreator;
-import io.github.nnkwrik.common.dto.JWTUser;
+import io.github.nnkwrik.authservice.service.AuthService;
 import io.github.nnkwrik.common.dto.Response;
 import io.github.nnkwrik.common.mq.UserRegisterStream;
-import io.github.nnkwrik.common.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.stream.annotation.EnableBinding;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
 
-import java.io.IOException;
 import java.util.Map;
 
 /**
@@ -33,25 +28,20 @@ import java.util.Map;
 @Slf4j
 @RestController
 @EnableBinding(UserRegisterStream.class)
+@RequestMapping("/auth")
 public class AuthController {
 
 
     @Autowired
-    private TokenCreator creator;
+    private AuthService authService;
 
 
     @Autowired
     private RegisterStreamSender registerSender;
 
-//    @GetMapping("/test/{message}")
-//    public String test(@PathVariable String message) {
-//        registerSender.send(message);
-//        return "test is success";
-//    }
 
-
-    @PostMapping("/auth/loginByWeixin")
-    public Response loginByWeixin(@RequestBody AuthDTO authDTO) throws IOException {
+    @PostMapping("/loginByWeixin")
+    public Response loginByWeixin(@RequestBody AuthDTO authDTO) {
 
         log.info("用户登录 : {}", authDTO);
         WxMaUserService wxUserService = WxMaConfiguration.getMaServices().getUserService();
@@ -76,50 +66,37 @@ public class AuthController {
             return Response.fail(Response.CHECK_USER_WITH_SESSION_FAIL, message);
         }
 
-        String userData = setOpenId4Data(detail.getRawData(), openId);
-        if (authDTO.getFirstLogin()) {
-            //异步调用user-service注册到数据库
-            registerSender.send(userData);
-        }
+        String userData = authService.setOpenId4Data(detail.getRawData(), openId);
+        //异步调用user-service注册到数据库
+        registerSender.send(userData);
 
         //构造JWT token
-        AuthVo vo = createToken(userData);
+        AuthVo vo = authService.createToken(userData);
 
         log.info("认证成功,用户信息 : {}", vo);
         return Response.ok(vo);
     }
 
     /**
-     * 在原有的rawData中附上openId
+     * 测试环境专用
      *
-     * @param rawData
-     * @param openId
+     * @param
      * @return
-     * @throws IOException
      */
-    private String setOpenId4Data(String rawData, String openId) throws IOException {
-
+    @PostMapping("/loginByWeixinDev")
+    public Response loginByWeixinDev(@RequestBody Map<String, String> jsonMap, @RequestHeader("Authorization") String token) throws JsonProcessingException {
+        log.info("用户登录 : {}", "测试");
+//        JsonUtil.fromJson()
         ObjectMapper mapper = new ObjectMapper();
-        ObjectNode node = (ObjectNode) mapper.readTree(rawData);
-        node.remove("openId");
-        node.put("openId", openId);
-        return node.toString();
-    }
+        String userData = mapper.writeValueAsString(jsonMap);
+
+        //异步调用user-service注册到数据库
+        registerSender.send(userData);
+
+        AuthVo vo = authService.createToken(userData);
+        return Response.ok(vo);
 
-    /**
-     * 通过json用户信息构造vo
-     * @param userData
-     * @return
-     */
-    private AuthVo createToken(String userData) {
-        Map<String, String> rawData =
-                JsonUtil.fromJson(userData, new TypeReference<Map<String, String>>() {
-                });
-        String openId = rawData.get("openId");
-        String nickname = rawData.get("nickName");
-        String avatar = rawData.get("avatarUrl");
-        String token = creator.create(openId, nickname, avatar);
-        return new AuthVo(token, nickname, avatar);
     }
 
+
 }

+ 1 - 1
auth-service/src/main/java/io/github/nnkwrik/authservice/dto/AuthDTO.java

@@ -10,5 +10,5 @@ import lombok.Data;
 public class AuthDTO {
     private String code;
     private DetailAuthDTO detail;
-    private Boolean firstLogin;
+    private String expiredToken;
 }

+ 3 - 14
auth-service/src/main/java/io/github/nnkwrik/authservice/model/vo/AuthVo.java

@@ -1,5 +1,6 @@
 package io.github.nnkwrik.authservice.model.vo;
 
+import io.github.nnkwrik.common.dto.JWTUser;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -10,20 +11,8 @@ import lombok.NoArgsConstructor;
  */
 @Data
 @NoArgsConstructor
+@AllArgsConstructor
 public class AuthVo {
     private String token;
-    private UserInfo userInfo;
-
-    public AuthVo(String token, String nickname, String avatar) {
-        this.token = token;
-        this.userInfo = new UserInfo(nickname, avatar);
-    }
-
-
-}
-@Data
-@AllArgsConstructor
-class UserInfo {
-    private String nickname;
-    private String avatar;
+    private JWTUser userInfo;
 }

+ 3 - 0
auth-service/src/main/java/io/github/nnkwrik/authservice/mq/RegisterStreamSender.java

@@ -1,6 +1,7 @@
 package io.github.nnkwrik.authservice.mq;
 
 import io.github.nnkwrik.common.mq.UserRegisterStream;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.stream.annotation.EnableBinding;
 import org.springframework.messaging.support.MessageBuilder;
@@ -12,12 +13,14 @@ import org.springframework.stereotype.Component;
  */
 @Component
 @EnableBinding(UserRegisterStream.class)
+@Slf4j
 public class RegisterStreamSender {
 
     @Autowired
     private UserRegisterStream streamClient;
 
     public void send(String userDate) {
+        log.info("向【用户服务】发起【用户注册】的消息,消息内容:{}",userDate);
         streamClient.output().send(MessageBuilder.withPayload(userDate).build());
     }
 }

+ 16 - 0
auth-service/src/main/java/io/github/nnkwrik/authservice/service/AuthService.java

@@ -0,0 +1,16 @@
+package io.github.nnkwrik.authservice.service;
+
+import io.github.nnkwrik.authservice.model.vo.AuthVo;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/24 14:46
+ */
+public interface AuthService {
+    String setOpenId4Data(String rawData, String openId);
+
+    AuthVo createToken(String userData);
+
+//    boolean isExpiredToken(String token, String loginOpenId);
+
+}

+ 127 - 0
auth-service/src/main/java/io/github/nnkwrik/authservice/service/impl/AuthServiceImpl.java

@@ -0,0 +1,127 @@
+package io.github.nnkwrik.authservice.service.impl;
+
+import com.auth0.jwt.exceptions.TokenExpiredException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import io.github.nnkwrik.authservice.model.vo.AuthVo;
+import io.github.nnkwrik.authservice.service.AuthService;
+import io.github.nnkwrik.authservice.token.TokenCreator;
+import io.github.nnkwrik.common.dto.JWTUser;
+import io.github.nnkwrik.common.token.TokenSolver;
+import io.github.nnkwrik.common.util.JsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.Base64;
+import java.util.Map;
+
+/**
+ * @author nnkwrik
+ * @date 18/11/24 14:48
+ */
+@Service
+@Slf4j
+public class AuthServiceImpl implements AuthService {
+
+    @Autowired
+    private TokenCreator tokenCreator;
+
+    @Autowired
+    private TokenSolver tokenSolver;
+
+
+    /**
+     * 在原有的rawData中附上openId
+     *
+     * @param rawData
+     * @param openId
+     * @return
+     * @throws IOException
+     */
+    @Override
+    public String setOpenId4Data(String rawData, String openId) {
+
+        ObjectMapper mapper = new ObjectMapper();
+        ObjectNode node = null;
+        try {
+            node = (ObjectNode) mapper.readTree(rawData);
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+        node.remove("openId");
+        node.put("openId", openId);
+        return node.toString();
+    }
+
+    /**
+     * 通过json用户信息构造vo
+     *
+     * @param userData
+     * @return
+     */
+    @Override
+    public AuthVo createToken(String userData) {
+        Map<String, String> rawData =
+                JsonUtil.fromJson(userData, JsonUtil.simpleJsonMap);
+        String openId = rawData.get("openId");
+        String nickname = rawData.get("nickName");
+        String avatar = rawData.get("avatarUrl");
+        JWTUser jwtUser = new JWTUser(openId, nickname, avatar);
+        String token = null;
+        try {
+            token = tokenCreator.create(jwtUser);
+        } catch (IllegalAccessException e) {
+            log.info("token构造失败");
+            e.printStackTrace();
+        }
+        return new AuthVo(token, jwtUser);
+    }
+//
+//    /**
+//     * 确认是否是内容正确但过期的token
+//     * @param token 从客户端传来的token
+//     * @param loginOpenId 本次登录获取到的openId
+//     * @return
+//     */
+//    @Override
+//    public boolean isExpiredToken(String token, String loginOpenId) {
+//        try {
+//            JWTUser jwtUser = tokenSolver.solve(token);
+//            log.info("token没有失效,有效的jwt");
+//            return isSameOpenId(jwtUser.getOpenId(), loginOpenId);
+//
+//        } catch (TokenExpiredException e) {
+//            log.info("过期的jwt,过期时间:{}", e.getMessage());
+//            String openIdFromToken = getOpenIdFromToken(token);
+//            return isSameOpenId(openIdFromToken, loginOpenId);
+//
+//        } catch (Exception e) {
+//            log.info("jwt解析失败");
+//        }
+//        return false;
+//    }
+//
+//
+//    private String getOpenIdFromToken(String token) {
+//        Base64.Decoder decoder = Base64.getUrlDecoder();
+//        token = token.replace("Bearer ", "");
+//        String[] parts = token.split("\\.");
+//        String payload = new String(decoder.decode(parts[1]));
+//        Map<String, String> json = JsonUtil.fromJson(payload, JsonUtil.simpleJsonMap);
+//        return json.get("openId");
+//
+//    }
+//
+//    private boolean isSameOpenId(String oldId, String newId) {
+//        if (oldId.equals(newId)) {
+//            return true;
+//        }
+//        log.info("过期的jwt中的openid和本次注册的openid不同。过期的openid={},本次注册的openId={}", oldId, newId);
+//        return false;
+//    }
+
+
+}

+ 1 - 1
auth-service/src/main/java/io/github/nnkwrik/authservice/token/TokenCreator.java

@@ -28,7 +28,7 @@ public class TokenCreator {
     @Value("${jwt.pvt-key-file-name}")
     private String pvtFile;
 
-    private RSAKeyProvider keyProvider = new RSAKeyProvider() {
+    public RSAKeyProvider keyProvider = new RSAKeyProvider() {
 
         RSAPrivateKey key;
 

+ 43 - 1
auth-service/src/test/java/io/github/nnkwrik/authservice/jwt/GenerateToken.java

@@ -1,5 +1,8 @@
 package io.github.nnkwrik.authservice.jwt;
 
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTCreator;
+import com.auth0.jwt.algorithms.Algorithm;
 import io.github.nnkwrik.authservice.token.TokenCreator;
 import io.github.nnkwrik.common.dto.JWTUser;
 import org.junit.Test;
@@ -8,6 +11,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.lang.reflect.Field;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+
 /**
  * @author nnkwrik
  * @date 18/11/19 9:47
@@ -28,7 +36,7 @@ public class GenerateToken {
         String nickName = "测试用户";
         String avatarUrl = "https://avatars2.githubusercontent.com/u/29662114?s=460&v=4";
 
-        JWTUser jwtUser = new JWTUser(openId,nickName,avatarUrl);
+        JWTUser jwtUser = new JWTUser(openId, nickName, avatarUrl);
         String token = creator.create(jwtUser);
 
         System.out.println("==================== 生成的Token =========================\n");
@@ -36,4 +44,38 @@ public class GenerateToken {
         System.out.println("\n=========================================================");
 
     }
+
+    @Test
+    public void generateExpiredToken() throws IllegalAccessException {
+        String openId = "1";
+        String nickName = "测试用户";
+        String avatarUrl = "https://avatars2.githubusercontent.com/u/29662114?s=460&v=4";
+
+        JWTUser jwtUser = new JWTUser(openId, nickName, avatarUrl);
+        String token = createExpiredToken(jwtUser);
+
+        System.out.println("==================== 生成的Token =========================\n");
+        System.out.println(token);
+        System.out.println("\n=========================================================");
+    }
+
+
+    private String createExpiredToken(JWTUser jwtUser) throws IllegalAccessException {
+        Algorithm algorithm = Algorithm.RSA256(creator.keyProvider);
+        //一秒后过期
+        Date expire = Date.from(Instant.now().plus(1, ChronoUnit.SECONDS));
+
+        JWTCreator.Builder builder = JWT.create();
+
+        //通过反射构造token字符串
+        for (Field field : jwtUser.getClass().getDeclaredFields()) {
+            field.setAccessible(true);
+            String value = (String) field.get(jwtUser);
+            String name = field.getName();
+            builder.withClaim(name, value);
+        }
+        String token = builder.withExpiresAt(expire).sign(algorithm);
+
+        return "Bearer " + token;
+    }
 }

+ 1 - 1
auth-service/src/test/java/io/github/nnkwrik/authservice/jwt/TestToken.java

@@ -39,7 +39,7 @@ public class TestToken {
 
         JWTUser jwtUser = new JWTUser();
         jwtUser.setOpenId("1212");
-        jwtUser.setNickname("nickName");
+        jwtUser.setNickName("nickName");
 
 
         //找到resource目录下的私钥文件后生成Token

+ 2 - 2
common/src/main/java/io/github/nnkwrik/common/dto/JWTUser.java

@@ -14,8 +14,8 @@ import lombok.NoArgsConstructor;
 public class JWTUser {
 
     private String openId;
-    private String nickname;
-    private String avatar;
+    private String nickName;
+    private String avatarUrl;
 
 
 }

+ 1 - 1
common/src/main/java/io/github/nnkwrik/common/token/TokenSolver.java

@@ -24,7 +24,7 @@ public class TokenSolver {
     @Value("${jwt.pub-key-file-name}")
     private String pubFile;
 
-    private RSAKeyProvider keyProvider = new RSAKeyProvider() {
+    public RSAKeyProvider keyProvider = new RSAKeyProvider() {
 
         RSAPublicKey key;
 

+ 3 - 0
common/src/main/java/io/github/nnkwrik/common/util/JsonUtil.java

@@ -13,6 +13,9 @@ import java.util.Map;
 public class JsonUtil {
     private static ObjectMapper mapper = new ObjectMapper();
 
+    public static TypeReference<Map<String, String>> simpleJsonMap =
+            new TypeReference<Map<String, String>>(){};
+
     public static Map<String, String> fromJson(String rawData, TypeReference typeReference) {
         try {
             return mapper.readValue(rawData, typeReference);

+ 1 - 1
goods-service/src/main/java/io/github/nnkwrik/goodsservice/cache/SearchCache.java

@@ -22,7 +22,7 @@ import java.util.stream.Collectors;
 @Component
 public class SearchCache {
     /**
-     * @key 搜索关键字 TODO 分词
+     * @key 搜索关键字
      * @value 搜索次数
      */
     private Cache<String, AtomicInteger> cache =

+ 5 - 4
goods-service/src/main/java/io/github/nnkwrik/goodsservice/controller/GoodsController.java

@@ -24,6 +24,7 @@ import java.util.Map;
  */
 @Slf4j
 @RestController
+@RequestMapping("/goods")
 public class GoodsController {
 
     @Autowired
@@ -35,7 +36,7 @@ public class GoodsController {
      * @param categoryId
      * @return
      */
-    @GetMapping("/goods/category/{categoryId}")
+    @GetMapping("/category/{categoryId}")
 
     public Response<CategoryVo> getCategoryPage(@PathVariable("categoryId") int categoryId,
                                                 @RequestParam(value = "page", defaultValue = "1") int page,
@@ -48,7 +49,7 @@ public class GoodsController {
         return Response.ok(vo);
     }
 
-    @GetMapping("/goods/list/{categoryId}")
+    @GetMapping("/list/{categoryId}")
     public Response<CategoryVo> getGoodsByCategory(@PathVariable("categoryId") int categoryId,
                                                    @RequestParam(value = "page", defaultValue = "1") int page,
                                                    @RequestParam(value = "limit", defaultValue = "10") int size) {
@@ -58,7 +59,7 @@ public class GoodsController {
 
     }
 
-    @GetMapping("/goods/detail/{goodsId}")
+    @GetMapping("/detail/{goodsId}")
     public Response<GoodsDetailPageVo> getGoodsDetail(@PathVariable("goodsId") int goodsId,
                                                       @JWT JWTUser jwtUser) {
         //更新浏览次数
@@ -79,7 +80,7 @@ public class GoodsController {
         return Response.ok(vo);
     }
 
-    @GetMapping("/goods/related/{goodsId}")
+    @GetMapping("/related/{goodsId}")
     public Response<GoodsRelatedVo> getGoodsRelated(@PathVariable("goodsId") int goodsId) {
         GoodsRelatedVo vo = goodsService.getGoodsRelated(goodsId);
         log.debug("与 goodsId=[] 相关的商品 : {}", goodsId, vo);

+ 4 - 5
goods-service/src/main/java/io/github/nnkwrik/goodsservice/controller/SearchController.java

@@ -21,6 +21,7 @@ import java.util.List;
  */
 @Slf4j
 @RestController
+@RequestMapping("/search")
 public class SearchController {
 
 
@@ -32,7 +33,7 @@ public class SearchController {
     private SearchService searchService;
 
 
-    @GetMapping("/search/index")
+    @GetMapping("/index")
     public Response<SearchIndexPageVo> searchIndex(@JWT JWTUser jwtUser) {
         List<String> historyKeyword = null;
         if (jwtUser != null) {
@@ -46,7 +47,7 @@ public class SearchController {
         return Response.ok(vo);
     }
 
-    @GetMapping("/search/clearhistory")
+    @GetMapping("/clearhistory")
     public Response clearHistory(@JWT JWTUser jwtUser) {
         if (jwtUser == null) return Response.fail(Response.OPEN_ID_IS_EMPTY, "用户id为空,请登陆后再尝试");
         searchService.clearUserHistory(jwtUser.getOpenId());
@@ -54,9 +55,7 @@ public class SearchController {
         return Response.ok();
     }
 
-
-    //TODO 后期提供排序和地区和卖家信用的筛选功能
-    @GetMapping("search/result/{keyword}")
+    @GetMapping("/result/{keyword}")
     public Response<List<GoodsSimpleVo>> searchGoods(@PathVariable("keyword") String keyword,
                                                      @RequestParam(value = "page", defaultValue = "1") int page,
                                                      @RequestParam(value = "limit", defaultValue = "10") int size,

+ 3 - 1
goods-service/src/main/java/io/github/nnkwrik/goodsservice/model/po/GoodsComment.java

@@ -2,6 +2,8 @@ package io.github.nnkwrik.goodsservice.model.po;
 
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * @author nnkwrik
  * @date 18/11/23 16:05
@@ -15,5 +17,5 @@ public class GoodsComment {
     private String replyUserId;
     private String content;
     private boolean isDelete;
-    private Data createTime;
+    private Date createTime;
 }

+ 0 - 1
goods-service/src/main/java/io/github/nnkwrik/goodsservice/model/vo/GoodsDetailPageVo.java

@@ -1,6 +1,5 @@
 package io.github.nnkwrik.goodsservice.model.vo;
 
-import io.github.nnkwrik.common.dto.SimpleUser;
 import io.github.nnkwrik.goodsservice.model.vo.inner.CommentVo;
 import io.github.nnkwrik.goodsservice.model.vo.inner.GalleryVo;
 import io.github.nnkwrik.goodsservice.model.vo.inner.GoodsDetailVo;

+ 3 - 3
goods-service/src/main/java/io/github/nnkwrik/goodsservice/model/vo/inner/CommentVo.java

@@ -17,9 +17,9 @@ public class CommentVo {
     private Integer reply_comment_id;
     private String reply_user_id;
     private String content;
-    private boolean is_delete;
     private String create_time;
 
-    SimpleUser simpleUser;
-    List<CommentVo> replyList;
+    private SimpleUser simpleUser;
+    private String reply_user_name;
+    private List<CommentVo> replyList;
 }

+ 6 - 0
goods-service/src/main/java/io/github/nnkwrik/goodsservice/service/impl/GoodsServiceImpl.java

@@ -161,6 +161,12 @@ public class GoodsServiceImpl implements GoodsService {
         } else {
             comment.setSimpleUser(userDTO);
         }
+        SimpleUser replyUserDTO = simpleUserMap.get(comment.getReply_user_id());
+        if (replyUserDTO == null){
+            comment.setReply_user_name("用户不存在");
+        }else {
+            comment.setReply_user_name(replyUserDTO.getNickName());
+        }
         return comment;
     }
 

+ 2 - 3
goods-service/src/main/java/io/github/nnkwrik/goodsservice/util/PO2VO.java

@@ -61,7 +61,7 @@ public class PO2VO {
                 vo.setBrowse_count(po.getBrowseCount());
                 //Date转String
                 if (po.getLastEdit() != null) {
-                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                     vo.setLast_edit(formatter.format(po.getLastEdit()));
                 }
                 return vo;
@@ -83,9 +83,8 @@ public class PO2VO {
                 vo.setUser_id(po.getUserId());
                 vo.setReply_comment_id(po.getReplyCommentId());
                 vo.setReply_user_id(po.getReplyUserId());
-                vo.set_delete(po.isDelete());
                 if (po.getCreateTime() != null) {
-                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                     vo.setCreate_time(formatter.format(po.getCreateTime()));
                 }
 

+ 15 - 4
user-service/src/main/java/io/github/nnkwrik/userservice/dao/UserMapper.java

@@ -12,10 +12,21 @@ import java.util.List;
 @Mapper
 public interface UserMapper {
 
-    @Insert("insert into user (open_id,nick_name,avatar_url,gender,language,city,province,country) " +
-            "values (#{openId},#{nickName},#{avatarUrl},#{gender}," +
-            "#{language},#{city},#{province},#{country})")
-//    @SelectKey(resultType = Integer.class, before = false, keyProperty = "id", statement = "SELECT LAST_INSERT_ID()")
+//    @Insert("insert into user (open_id,nick_name,avatar_url,gender,language,city,province,country) " +
+//            "values (#{openId},#{nickName},#{avatarUrl},#{gender}," +
+//            "#{language},#{city},#{province},#{country})")
+////    @SelectKey(resultType = Integer.class, before = false, keyProperty = "id", statement = "SELECT LAST_INSERT_ID()")
+//    void register(User user);
+
+    /**
+     * 注册用户:存在相同的openId时update,不存在则insert
+     * @param user
+     */
+    @Insert("insert into user (open_id, nick_name, avatar_url, gender, language, city, province, country)\n" +
+            "values (#{openId},#{nickName},#{avatarUrl},#{gender},#{language},#{city},#{province},#{country})\n" +
+            "on duplicate key update nick_name = #{nickName} , " +
+            "                                  avatar_url = #{avatarUrl} , gender = #{gender} , language = #{language} ,"+
+            "                                  city = #{city} , province = #{province} , country = #{country}")
     void register(User user);
 
 

+ 2 - 0
user-service/src/main/java/io/github/nnkwrik/userservice/mq/RegisterStreamReceiver.java

@@ -24,10 +24,12 @@ public class RegisterStreamReceiver {
 
     @StreamListener(target = UserRegisterStream.INPUT)
     public void receive(String userData){
+        if (userData == null) return;
         User user = JsonUtil.fromJson(userData, User.class);
 
         log.info("从 [ auth-service ] 收到 [ 用户注册 ]的消息");
         log.info("新用户:用户名 = [{}],城市 = [{}]", user.getNickName(), user.getCity());
+        //TODO 先确认用户是否存在
         userService.register(user);
     }
 }

+ 79 - 0
zuul/pom.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.nnkwrik</groupId>
+    <artifactId>zuul</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>zuul</name>
+    <description>Demo project for Spring Boot</description>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.1.0.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <spring-cloud.version>Greenwich.M3</spring-cloud.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/milestone</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+
+</project>

+ 13 - 0
zuul/src/main/java/com/nnkwrik/zuul/ZuulApplication.java

@@ -0,0 +1,13 @@
+package com.nnkwrik.zuul;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+
+@SpringBootApplication
+@EnableZuulProxy
+public class ZuulApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ZuulApplication.class, args);
+    }
+}

+ 38 - 0
zuul/src/main/resources/application.yml

@@ -0,0 +1,38 @@
+server:
+  port: 8080
+eureka:
+  client:
+    service-url:
+      defaultZone: http://localhost:8801/eureka/
+spring:
+  application:
+    name: api-gateway
+
+zuul:
+  routes:
+    #auth-service
+    auth:
+      path: /auth/**
+      serviceId: auth-service
+      strip-prefix: false
+    #goods-service
+    goods:
+      path: /goods/**
+      serviceId: goods-service
+      strip-prefix: false
+    index:
+      path: /index/**
+      serviceId: goods-service
+      strip-prefix: false
+    catalog:
+      path: /catalog/**
+      serviceId: goods-service
+      strip-prefix: false
+    search:
+      path: /search/**
+      serviceId: goods-service
+      strip-prefix: false
+
+
+
+

+ 16 - 0
zuul/src/test/java/com/nnkwrik/zuul/ZuulApplicationTests.java

@@ -0,0 +1,16 @@
+package com.nnkwrik.zuul;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class ZuulApplicationTests {
+
+    @Test
+    public void contextLoads() {
+    }
+
+}