Browse Source

完成消息服务,包括和商品服务的整合

nnkwrik 6 years ago
parent
commit
fe943be03f
23 changed files with 292 additions and 260 deletions
  1. 2 2
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/GoodsServiceApplication.java
  2. 17 0
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/controller/UserController.java
  3. 2 0
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/service/UserService.java
  4. 7 0
      goods-service/src/main/java/io/github/nnkwrik/goodsservice/service/impl/UserServiceImpl.java
  5. 4 5
      im-service/src/main/java/io/github/nnkwrik/imservice/controller/ChatController.java
  6. 22 5
      im-service/src/main/java/io/github/nnkwrik/imservice/controller/ImServiceController.java
  7. 4 1
      im-service/src/main/java/io/github/nnkwrik/imservice/dao/ChatMapper.java
  8. 16 6
      im-service/src/main/java/io/github/nnkwrik/imservice/service/impl/FormServiceImpl.java
  9. 16 4
      im-service/src/main/java/io/github/nnkwrik/imservice/service/impl/IndexServiceImpl.java
  10. 1 1
      im-service/src/main/java/io/github/nnkwrik/imservice/service/impl/WebSocketServiceImpl.java
  11. 8 8
      im-service/src/main/java/io/github/nnkwrik/imservice/websocket/ChatEndpoint.java
  12. 1 5
      im-service/src/main/resources/application.yml
  13. 1 1
      inner-api/src/main/java/fangxianyu/innerApi/im/ImClient.java
  14. 9 70
      wx-front/app.js
  15. 49 48
      wx-front/config/api.js
  16. 3 0
      wx-front/pages/auth/auth.js
  17. 0 1
      wx-front/pages/chat/chatForm/chatForm.js
  18. 1 1
      wx-front/pages/chat/chatForm/chatForm.wxss
  19. 39 27
      wx-front/pages/goods/goods.js
  20. 1 1
      wx-front/pages/goods/goods.wxml
  21. 82 73
      wx-front/services/websocket.js
  22. 1 1
      wx-front/utils/util.js
  23. 6 0
      zuul/src/main/resources/application.yml

+ 2 - 2
goods-service/src/main/java/io/github/nnkwrik/goodsservice/GoodsServiceApplication.java

@@ -5,9 +5,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 
-@SpringBootApplication(scanBasePackages = {"io.github.nnkwrik", "fangxianyu.innerApi.user"})
+@SpringBootApplication(scanBasePackages = {"io.github.nnkwrik", "fangxianyu.innerApi.user", "fangxianyu.innerApi.im"})
 @EnableEurekaClient
-@EnableFeignClients(basePackages = "fangxianyu.innerApi.user")
+@EnableFeignClients(basePackages = {"fangxianyu.innerApi.user", "fangxianyu.innerApi.im"})
 public class GoodsServiceApplication {
 
     public static void main(String[] args) {

+ 17 - 0
goods-service/src/main/java/io/github/nnkwrik/goodsservice/controller/UserController.java

@@ -1,5 +1,6 @@
 package io.github.nnkwrik.goodsservice.controller;
 
+import fangxianyu.innerApi.im.ImClientHandler;
 import fangxianyu.innerApi.user.UserClientHandler;
 import io.github.nnkwrik.common.dto.JWTUser;
 import io.github.nnkwrik.common.dto.Response;
@@ -33,6 +34,9 @@ public class UserController {
     @Autowired
     private UserClientHandler userClientHandler;
 
+    @Autowired
+    private ImClientHandler imClientHandler;
+
     /**
      * 收藏或取消收藏某个商品
      *
@@ -141,5 +145,18 @@ public class UserController {
         return Response.ok(userHistory);
     }
 
+    @PostMapping("/goods/want/{goodsId}/{sellerId}")
+    public Response<Integer> want(@JWT(required = true) JWTUser user,
+                                  @PathVariable("goodsId") int goodsId,
+                                  @PathVariable("sellerId") String sellerId){
+
+        userService.addWant(goodsId,user.getOpenId());
+        //创建对话
+        Integer chatId = imClientHandler.createChat(goodsId, user.getOpenId(), sellerId);
+        log.info("用户id=[{}],将商品id=[{}]标记为想要.并创建对话,chatId=[{}]",user.getOpenId(),goodsId,chatId);
+
+        return Response.ok(chatId);
+    }
+
 
 }

+ 2 - 0
goods-service/src/main/java/io/github/nnkwrik/goodsservice/service/UserService.java

@@ -24,4 +24,6 @@ public interface UserService {
     List<Goods> getUserPosted(String userId, int page, int size);
 
     LinkedHashMap<String, List<Goods>> getUserHistoryList(String userId, int page, int size);
+
+    void addWant(int goodsId, String userId);
 }

+ 7 - 0
goods-service/src/main/java/io/github/nnkwrik/goodsservice/service/impl/UserServiceImpl.java

@@ -96,6 +96,13 @@ public class UserServiceImpl implements UserService {
         return result;
     }
 
+    @Override
+    public void addWant(int goodsId, String userId) {
+        if (!userMapper.userHasWant(userId, goodsId)) {
+            userMapper.setUserWant(userId, goodsId);
+        }
+    }
+
     private LocalDate getDay(Date date) {
         return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
     }

+ 4 - 5
im-service/src/main/java/io/github/nnkwrik/imservice/controller/ChatController.java

@@ -23,10 +23,9 @@ import java.util.List;
  */
 @RestController
 @Slf4j
+@RequestMapping("/chat")
 public class ChatController {
 
-    @Autowired
-    private RedisClient redisClient;
 
     @Autowired
     private IndexService indexService;
@@ -36,7 +35,7 @@ public class ChatController {
 
 
     //打开消息一览时
-    @GetMapping("/chat/index")
+    @GetMapping("/index")
     public Response<List<ChatIndex>> getChatIndex(@JWT JWTUser user,
                                                   @RequestParam(value = "offsetTime", required = false)
                                                   @DateTimeFormat(pattern = StdDateFormat.DATE_FORMAT_STR_ISO8601) Date offsetTime,
@@ -54,7 +53,7 @@ public class ChatController {
     }
 
     //打开聊天框时
-    @GetMapping("/chat/form/{chatId}")
+    @GetMapping("/form/{chatId}")
     public Response<ChatForm> getChatForm(@PathVariable("chatId") int chatId,
                                           @JWT(required = true) JWTUser user,
                                           @RequestParam(value = "offsetTime", required = false)
@@ -71,7 +70,7 @@ public class ChatController {
     }
 
     //把所有未读设为已读, 通过ws实时阅读到消息时
-    @PostMapping("/chat/flushUnread/{chatId}")
+    @PostMapping("/flushUnread/{chatId}")
     public Response flushUnread(@PathVariable("chatId") int chatId,
                                 @JWT(required = true) JWTUser user) {
         formService.flushUnread(chatId ,user.getOpenId());

+ 22 - 5
im-service/src/main/java/io/github/nnkwrik/imservice/controller/ImServiceController.java

@@ -1,8 +1,11 @@
 package io.github.nnkwrik.imservice.controller;
 
 import io.github.nnkwrik.common.dto.Response;
+import io.github.nnkwrik.imservice.constant.MessageType;
 import io.github.nnkwrik.imservice.dao.ChatMapper;
+import io.github.nnkwrik.imservice.dao.HistoryMapper;
 import io.github.nnkwrik.imservice.model.po.Chat;
+import io.github.nnkwrik.imservice.model.po.History;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -22,6 +25,9 @@ public class ImServiceController {
     @Autowired
     private ChatMapper chatMapper;
 
+    @Autowired
+    private HistoryMapper historyMapper;
+
     @PostMapping("/createChat/{goodsId}/{senderId}/{receiverId}")
     public Response<Integer> createChat(@PathVariable("goodsId") int goodsId,
                                         @PathVariable("senderId") String senderId,
@@ -33,17 +39,28 @@ public class ImServiceController {
             chat.setU1(senderId);
             chat.setU2(receiverId);
             chat.setShowToU1(true);
-            chat.setShowToU1(false);
+            chat.setShowToU2(false);
         } else {
             chat.setU1(receiverId);
             chat.setU2(senderId);
             chat.setShowToU1(false);
-            chat.setShowToU1(true);
+            chat.setShowToU2(true);
         }
-        chatMapper.addChat(chat);
+        Integer chatId = chatMapper.getChatIdByChat(chat);
+        if (chatId == null){
+            chatMapper.addChat(chat);
+            chatId = chat.getId();
+
+            History history = new History();
+            history.setChatId(chatId);
+            history.setU1ToU2(senderId.compareTo(receiverId) < 0?true:false);
+            history.setMessageType(MessageType.ESTABLISH_CHAT);
+            historyMapper.addHistory(history);
+        }
+
 
-        log.info("创建聊天chatId={},发起人id={},接收方id={}", chat.getId(), senderId, receiverId);
-        return Response.ok(chat.getId());
+        log.info("创建聊天chatId={},发起人id={},接收方id={}", chatId, senderId, receiverId);
+        return Response.ok(chatId);
 
     }
 }

+ 4 - 1
im-service/src/main/java/io/github/nnkwrik/imservice/dao/ChatMapper.java

@@ -12,7 +12,7 @@ import java.util.List;
 @Mapper
 public interface ChatMapper {
 
-    @Select("insert into chat (u1, u2, goods_id, show_to_u1, show_to_u2)\n" +
+    @Insert("insert into chat (u1, u2, goods_id, show_to_u1, show_to_u2)\n" +
             "values (#{u1}, #{u2}, #{goodsId}, #{showToU1}, #{showToU2})")
     @SelectKey(resultType = Integer.class, before = false, keyProperty = "id", statement = "SELECT LAST_INSERT_ID()")
     void addChat(Chat chat);
@@ -29,4 +29,7 @@ public interface ChatMapper {
             "from chat where (u1 = #{user_id} and show_to_u1 = true) or (u2 = #{user_id} and show_to_u2 = true)")
     List<Integer> getChatIdsByUser(@Param("user_id") String userId);
 
+    @Select("select id from chat where u1 = #{u1} and u2 = #{u2} and goods_id = #{goodsId}")
+    Integer getChatIdByChat(Chat chat);
+
 }

+ 16 - 6
im-service/src/main/java/io/github/nnkwrik/imservice/service/impl/FormServiceImpl.java

@@ -90,15 +90,25 @@ public class FormServiceImpl implements FormService {
     @Override
     public List<History> flushUnread(int chatId, String userId) {
         List<WsMessage> unreadMsgList = redisClient.get(chatId + "");
-        List<History> unreadHistory = WsListToHisList(unreadMsgList);
-        if (unreadHistory != null && unreadHistory.size() > 0 && unreadMsgList.get(0).getReceiverId().equals(userId)) {
+        if (unreadMsgList != null && unreadMsgList.size() > 0) {
+            List<WsMessage> myUnreadMsgList = unreadMsgList.stream()
+                    .filter(unread -> unread.getReceiverId().equals(userId))
+                    .collect(Collectors.toList());
+            if (myUnreadMsgList == null || myUnreadMsgList.size() == 0 ){
+                return null;
+            }
             log.info("把chatId={}设为已读消息", chatId);
             //添加聊天记录
-            historyMapper.addHistoryList(unreadHistory);
-            redisClient.del(chatId + "");
-        }//否则不是receiver访问form,所以仍是未读状态,不刷入sql
+            List<History> myUnreadHistory = WsListToHisList(myUnreadMsgList);
+            historyMapper.addHistoryList(myUnreadHistory);
+            unreadMsgList.removeAll(myUnreadMsgList);
+            redisClient.set(chatId + "", unreadMsgList);
+
+            return myUnreadHistory;
+        } else {
+            return null;//否则不是receiver访问form,所以仍是未读状态,不刷入sql
+        }
 
-        return unreadHistory;
     }
 
 //    @Override

+ 16 - 4
im-service/src/main/java/io/github/nnkwrik/imservice/service/impl/IndexServiceImpl.java

@@ -61,7 +61,7 @@ public class IndexServiceImpl implements IndexService {
 
         //从redis(未读)和sql(已读)中各尝试取10个
         Map<Integer, Integer> unreadCount = new HashMap<>();
-        List<WsMessage> unread = getDisplayUnread(unreadMessage, unreadCount, size, offsetTime);
+        List<WsMessage> unread = getDisplayUnread(currentUser,unreadMessage, unreadCount, size, offsetTime);
         dealUnread(currentUser, unread, unreadCount, resultVoList, chatGoodsMap, chatUserMap);
 
 
@@ -86,14 +86,26 @@ public class IndexServiceImpl implements IndexService {
     }
 
 
-    private List<WsMessage> getDisplayUnread(List<List<WsMessage>> unreadMessage,
+    private List<WsMessage> getDisplayUnread(String currentUserId,
+                                             List<List<WsMessage>> unreadMessage,
                                              Map<Integer, Integer> unreadCount,
                                              int size, Date offsetTime) {
         if (ObjectUtils.isEmpty(unreadMessage)) return new ArrayList<>();
+//        List<WsMessage> displayUnread = unreadMessage.stream()
+//                .filter(msgList -> !ObjectUtils.isEmpty(msgList) && offsetTime.compareTo(msgList.get(msgList.size() - 1).getSendTime()) > 0)
+//                .map(msgList -> {
+//                    unreadCount.put(msgList.get(0).getChatId(), msgList.size());
+//                    return msgList.get(msgList.size() - 1);
+//                })
+//                .sorted((a, b) -> b.getSendTime().compareTo(a.getSendTime()))
+//                .limit(size)
+//                .collect(Collectors.toList());
+
         List<WsMessage> displayUnread = unreadMessage.stream()
-                .filter(msgList -> msgList != null && offsetTime.compareTo(msgList.get(msgList.size() - 1).getSendTime()) > 0)
+                .filter(msgList -> !ObjectUtils.isEmpty(msgList) && offsetTime.compareTo(msgList.get(msgList.size() - 1).getSendTime()) > 0)
                 .map(msgList -> {
-                    unreadCount.put(msgList.get(0).getChatId(), msgList.size());
+                    long count =  msgList.stream().filter(msg -> msg.getReceiverId().equals(currentUserId)).count();
+                    unreadCount.put(msgList.get(0).getChatId(), Math.toIntExact(count));
                     return msgList.get(msgList.size() - 1);
                 })
                 .sorted((a, b) -> b.getSendTime().compareTo(a.getSendTime()))

+ 1 - 1
im-service/src/main/java/io/github/nnkwrik/imservice/service/impl/WebSocketServiceImpl.java

@@ -48,7 +48,7 @@ public class WebSocketServiceImpl implements WebSocketService {
 
         //过滤自己发送的
         int unreadCount = lastChatList.stream()
-                .filter(chat -> chat != null && !chat.get(0).getSenderId().equals(userId))
+                .filter(chat -> !ObjectUtils.isEmpty(chat) && !chat.get(0).getSenderId().equals(userId))
                 .mapToInt(List::size)
                 .sum();
 

+ 8 - 8
im-service/src/main/java/io/github/nnkwrik/imservice/websocket/ChatEndpoint.java

@@ -43,16 +43,16 @@ public class ChatEndpoint {
         String token = (String) config.getUserProperties().get(JWTUser.class.getName());
         JWTUser user = solveToken(token);
 
-//        if (user == null || !user.getOpenId().equals(openId)) {
-//            log.info("【websocket消息】token检验失败,拒绝连接, openId = [{}]", openId);
-//            rejectConnect(session);
-//            session.close();
-//            return;
-//        }
+        if (user == null || !user.getOpenId().equals(openId)) {
+            log.info("【websocket消息】token检验失败,拒绝连接, openId = [{}]", openId);
+            rejectConnect(session);
+            session.close();
+            return;
+        }
         sessionMap.put(openId, session);
-//        log.info("【websocket消息】有新的连接, openId = [{}],用户昵称= [{}],未读消息数={}", openId, user.getNickName(),);
         int unreadCount = webSocketService.getUnreadCount(openId);
-        log.info("【websocket消息】有新的连接, openId = [{}],用户昵称= [{}],未读消息数={}", openId, "", unreadCount);
+        log.info("【websocket消息】有新的连接, openId = [{}],用户昵称= [{}],未读消息数={}", openId, user.getNickName(),unreadCount);
+//        log.info("【websocket消息】有新的连接, openId = [{}],用户昵称= [{}],未读消息数={}", openId, "", unreadCount);
 
         WsMessage wsMessage = new WsMessage();
         wsMessage.setMessageType(MessageType.UNREAD_NUM);

+ 1 - 5
im-service/src/main/resources/application.yml

@@ -26,10 +26,6 @@ server:
 mybatis:
   configuration:
     map-underscore-to-camel-case: true
-#
-#logging:
-#  level:
-#    org.springframework.web: info
-#    io.github.nnkwrik.goodsservice: debug
+
 jwt:
   pub-key-file-name: RSA.pub

+ 1 - 1
inner-api/src/main/java/fangxianyu/innerApi/im/ImClient.java

@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
  * @author nnkwrik
  * @date 18/12/08 19:23
  */
-@FeignClient(name = "chat-service")
+@FeignClient(name = "im-service")
 @RequestMapping("/chat-service")
 public interface ImClient {
 

+ 9 - 70
wx-front/app.js

@@ -19,81 +19,20 @@ App({
       console.log('app login')
       this.globalData.userInfo = wx.getStorageSync('userInfo');
       this.globalData.token = wx.getStorageSync('token');
+
       
-      websocket.wsConnect()
-      
+
     }).catch(() => {
 
     });
 
 
   },
-  // socketTask: function() {
-  //   var that = this;
-  //   SocketTask.onOpen(res => {
-  //     that.globalData.websocket.socketOpen = true;
-  //     console.log('监听 WebSocket 连接打开事件。', res)
-  //   })
-  //   SocketTask.onClose(onClose => {
-  //     console.log('监听 WebSocket 连接关闭事件。', onClose)
-  //     that.globalData.websocket.socketOpen = false;
-  //     this.webSocket()
-  //   })
-  //   SocketTask.onError(onError => {
-  //     console.log('监听 WebSocket 错误。错误信息', onError)
-  //     that.globalData.websocket.socketOpen = false
-  //   })
-  //   SocketTask.onMessage(onMessage => {
-  //     // console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data))
-  //   })
-  // },
-  // wsConnect: function() {
-  //   // 创建Socket
-  //   let that = this
-  //   SocketTask = wx.connectSocket({
-  //     url: api.ChatWs + '/' + this.globalData.userInfo.openId,
-  //     data: 'data',
-  //     header: {
-  //       'content-type': 'application/json'
-  //     },
-  //     method: 'post',
-  //     success: function(res) {
-  //       console.log('WebSocket连接创建', res)
-  //       that.wsOnMessage();
-  //     },
-  //     fail: function(err) {
-  //       wx.showToast({
-  //         title: '网络异常!',
-  //       })
-  //       console.log(err)
-  //     },
-  //   })
-  // },
-  wsOnMessage:function(){
-    if (!this.globalData.websocket.changeBadge){
-        console.log("不监听badge")
-        return
-    }
-    wx.onSocketMessage(onMessage => {
-      console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data))
-      var res = JSON.parse(onMessage.data)
-      if (res.errno === 0) {
-        console.log(res.data)
-        if (res.data.messageType == 3) {
-          if (res.data.messageBody != 0) {
-            wx.setTabBarBadge({
-              index: 3,
-              text: res.data.messageBody
-            })
-          }
-        } else if (res.data.messageType == 1){
-          
-        }
-      } else {
-        console.log(res)
-      }
-
-    })
+  onShow:function(){
+    websocket.wsConnect()
+  },
+  onHide: function() {
+    websocket.wsClose()
   },
 
 
@@ -108,8 +47,8 @@ App({
       socketOpen: false,
       changeBadge: true,
     }
-    
-    
+
+
   },
   testData: {
     userInfo: {

+ 49 - 48
wx-front/config/api.js

@@ -1,34 +1,35 @@
 // const ApiRootUrl = 'https://5d876383.ngrok.io/';
-const ApiRootUrl = 'http://127.0.0.1:8805/';
-const WebSocktUrl = 'ws://localhost:8805/'
+const ApiRootUrl = 'http://127.0.0.1:8080/';
+const WebSocktUrl = 'ws://127.0.0.1:8805/'
 
 module.exports = {
   IndexUrl: ApiRootUrl + 'index/index', //首页数据接口
   IndexMore: ApiRootUrl + 'index/more', //首页展示更多推荐商品
-  CatalogList: ApiRootUrl + 'catalog/index',  //分类目录全部分类数据接口
-  CatalogCurrent: ApiRootUrl + 'catalog',  //分类目录当前分类数据接口
+  CatalogList: ApiRootUrl + 'catalog/index', //分类目录全部分类数据接口
+  CatalogCurrent: ApiRootUrl + 'catalog', //分类目录当前分类数据接口
 
   AuthLoginByWeixin: ApiRootUrl + 'auth/loginByWeixin', //微信登录
 
-  GoodsCount: ApiRootUrl + 'goods/count',  //统计商品总数
-  GoodsList: ApiRootUrl + 'goods/list',  //获得商品列表
-  GoodsCategory: ApiRootUrl + 'goods/category',  //获得分类数据
-  GoodsDetail: ApiRootUrl + 'goods/detail',  //获得商品的详情
-  GoodsNew: ApiRootUrl + 'goods/new',  //新品
-  GoodsHot: ApiRootUrl + 'goods/hot',  //热门
-  GoodsRelated: ApiRootUrl + 'goods/related',  //商品详情页的关联商品(大家都在看)
+  GoodsCount: ApiRootUrl + 'goods/count', //统计商品总数
+  GoodsList: ApiRootUrl + 'goods/list', //获得商品列表
+  GoodsCategory: ApiRootUrl + 'goods/category', //获得分类数据
+  GoodsDetail: ApiRootUrl + 'goods/detail', //获得商品的详情
+  GoodsNew: ApiRootUrl + 'goods/new', //新品
+  GoodsHot: ApiRootUrl + 'goods/hot', //热门
+  GoodsRelated: ApiRootUrl + 'goods/related', //商品详情页的关联商品(大家都在看)
   GoodsPost: ApiRootUrl + 'goods/post', //发布商品
   GoodsDelete: ApiRootUrl + 'goods/delete', //删除商品
+  GoodsWant: ApiRootUrl + 'goods/want', //把商品标记为想要
 
   PostCateList: ApiRootUrl + 'category/post', //发布商品时选择分类
 
-  BrandList: ApiRootUrl + 'brand/list',  //品牌列表
-  BrandDetail: ApiRootUrl + 'brand/detail',  //品牌详情
+  BrandList: ApiRootUrl + 'brand/list', //品牌列表
+  BrandDetail: ApiRootUrl + 'brand/detail', //品牌详情
 
   ChatIndex: ApiRootUrl + 'chat/index', //消息一览
   ChatForm: ApiRootUrl + 'chat/form', //消息框
   ChatFlushUnread: ApiRootUrl + 'chat/flushUnread', //把所有未读设为已读
-  ChatWs: WebSocktUrl+'ws',  //消息WebSocket连接
+  ChatWs: WebSocktUrl + 'ws', //消息WebSocket连接
 
   CartList: ApiRootUrl + 'cart/index', //获取购物车的数据
   CartAdd: ApiRootUrl + 'cart/add', // 添加商品到购物车
@@ -41,40 +42,40 @@ module.exports = {
   OrderSubmit: ApiRootUrl + 'order/submit', // 提交订单
   PayPrepayId: ApiRootUrl + 'pay/prepay', //获取微信统一下单prepay_id
 
-  CollectList: ApiRootUrl + 'collect/list',  //收藏列表
-  CollectAddOrDelete: ApiRootUrl + 'collect/addordelete',  //添加或取消收藏
-  
-  PostedList: ApiRootUrl + 'goods/posted',  //发布的商品
-  BoughtList: ApiRootUrl + 'goods/bought',  //买过的商品
-  SoldList: ApiRootUrl + 'goods/sold',  //卖出的商品
-  UserPage: ApiRootUrl + 'goods/user',  //用户主页
-  UserPageMore: ApiRootUrl + 'goods/user/more',  //用户主页
-
-  CommentList: ApiRootUrl + 'comment/list',  //评论列表
-  CommentCount: ApiRootUrl + 'comment/count',  //评论总数
-  CommentPost: ApiRootUrl + 'comment/post',   //发表评论
-
-  TopicList: ApiRootUrl + 'topic/list',  //专题列表
-  TopicDetail: ApiRootUrl + 'topic/detail',  //专题详情GoodsDetail
-  TopicRelated: ApiRootUrl + 'topic/related',  //相关专题
-
-  SearchIndex: ApiRootUrl + 'search/index',  //搜索页面数据
-  SearchResult: ApiRootUrl + 'search/result',  //搜索数据
-  SearchHelper: ApiRootUrl + 'search/helper',  //搜索帮助
-  SearchClearHistory: ApiRootUrl + 'search/clearhistory',  //搜索帮助
-
-  AddressList: ApiRootUrl + 'address/list',  //收货地址列表
-  AddressDetail: ApiRootUrl + 'address/detail',  //收货地址详情
-  AddressSave: ApiRootUrl + 'address/save',  //保存收货地址
-  AddressDelete: ApiRootUrl + 'address/delete',  //保存收货地址
-
-  RegionList: ApiRootUrl + 'region/list',  //获取区域列表
-
-  OrderList: ApiRootUrl + 'order/list',  //订单列表
-  OrderDetail: ApiRootUrl + 'order/detail',  //订单详情
-  OrderCancel: ApiRootUrl + 'order/cancel',  //取消订单
+  CollectList: ApiRootUrl + 'collect/list', //收藏列表
+  CollectAddOrDelete: ApiRootUrl + 'collect/addordelete', //添加或取消收藏
+
+  PostedList: ApiRootUrl + 'goods/posted', //发布的商品
+  BoughtList: ApiRootUrl + 'goods/bought', //买过的商品
+  SoldList: ApiRootUrl + 'goods/sold', //卖出的商品
+  UserPage: ApiRootUrl + 'goods/user', //用户主页
+  UserPageMore: ApiRootUrl + 'goods/user/more', //用户主页
+
+  CommentList: ApiRootUrl + 'comment/list', //评论列表
+  CommentCount: ApiRootUrl + 'comment/count', //评论总数
+  CommentPost: ApiRootUrl + 'comment/post', //发表评论
+
+  TopicList: ApiRootUrl + 'topic/list', //专题列表
+  TopicDetail: ApiRootUrl + 'topic/detail', //专题详情GoodsDetail
+  TopicRelated: ApiRootUrl + 'topic/related', //相关专题
+
+  SearchIndex: ApiRootUrl + 'search/index', //搜索页面数据
+  SearchResult: ApiRootUrl + 'search/result', //搜索数据
+  SearchHelper: ApiRootUrl + 'search/helper', //搜索帮助
+  SearchClearHistory: ApiRootUrl + 'search/clearhistory', //搜索帮助
+
+  AddressList: ApiRootUrl + 'address/list', //收货地址列表
+  AddressDetail: ApiRootUrl + 'address/detail', //收货地址详情
+  AddressSave: ApiRootUrl + 'address/save', //保存收货地址
+  AddressDelete: ApiRootUrl + 'address/delete', //保存收货地址
+
+  RegionList: ApiRootUrl + 'region/list', //获取区域列表
+
+  OrderList: ApiRootUrl + 'order/list', //订单列表
+  OrderDetail: ApiRootUrl + 'order/detail', //订单详情
+  OrderCancel: ApiRootUrl + 'order/cancel', //取消订单
   OrderExpress: ApiRootUrl + 'order/express', //物流详情
 
-  FootprintList: ApiRootUrl + 'footprint/list',  //足迹列表
-  FootprintDelete: ApiRootUrl + 'footprint/delete',  //删除足迹
+  FootprintList: ApiRootUrl + 'footprint/list', //足迹列表
+  FootprintDelete: ApiRootUrl + 'footprint/delete', //删除足迹
 };

+ 3 - 0
wx-front/pages/auth/auth.js

@@ -2,6 +2,8 @@
 var app = getApp();
 var api = require('../../config/api.js');
 var util = require('../../utils/util.js');
+var websocket = require('../../services/websocket.js');
+  
 Page({
 
   /**
@@ -27,6 +29,7 @@ Page({
         userInfo: userInfo,
         hasUserInfo: true
       })
+      websocket.wsConnect()
     });
   },
   

+ 0 - 1
wx-front/pages/chat/chatForm/chatForm.js

@@ -233,7 +233,6 @@ Page({
    * 生命周期函数--监听页面卸载
    */
   onUnload: function() {
-    websocket.stopListenForm(this.data.id)
     websocket.listenBadge()
   },
 

+ 1 - 1
wx-front/pages/chat/chatForm/chatForm.wxss

@@ -233,7 +233,7 @@ page {
   font-size: 24rpx;
   background: #f94b4b;
   color: #fff;
-  margin-left: 120px;
+  margin-left:110px;
   padding: 10rpx;
 }
 

+ 39 - 27
wx-front/pages/goods/goods.js

@@ -10,7 +10,7 @@ Page({
     goods: {},
     gallery: [],
     comment: [],
-    isSeller:false,
+    isSeller: false,
     seller: {},
     sellerDates: 0,
     sellerHistory: 0,
@@ -19,7 +19,7 @@ Page({
     userHasCollect: 0,
 
     openComment: false,
-    openDelete:false,
+    openDelete: false,
     replyId: '',
     replyUserId: '',
     replyUserName: '',
@@ -38,12 +38,12 @@ Page({
         if (res.data.info.isDelete) {
           util.showErrorToast('商品不存在')
           setTimeout(function callback() {
-            
+
             wx.navigateBack({
               delta: 1
             })
           }, 1000)
-          return 
+          return
         }
 
         //计算卖家来平台第几天
@@ -70,7 +70,7 @@ Page({
           });
         }
 
-        if (that.data.seller.openId == wx.getStorageSync('userInfo').openId){
+        if (that.data.seller.openId == wx.getStorageSync('userInfo').openId) {
           console.log("当前用户是卖家")
           that.setData({
             isSeller: true
@@ -98,9 +98,9 @@ Page({
     });
 
   },
-  deleteGoods: function () {
+  deleteGoods: function() {
     let that = this;
-    util.request(api.GoodsDelete + '/' + that.data.id,{},'DELETE').then(function (res) {
+    util.request(api.GoodsDelete + '/' + that.data.id, {}, 'DELETE').then(function(res) {
       if (res.errno === 0) {
 
         setTimeout(function goback() {
@@ -112,7 +112,7 @@ Page({
         wx.showToast({
           title: '删除成功'
         })
-      }else{
+      } else {
         console.log(res.errmsg)
       }
     });
@@ -159,32 +159,32 @@ Page({
   },
 
   switchCommentPop: function(event) {
-    if(event.currentTarget.dataset.disable){
+    if (event.currentTarget.dataset.disable) {
       console.log("disable")
       return
     }
-      let that = this
+    let that = this
 
-      this.setData({
-        replyId: event.currentTarget.dataset.replyId,
-        replyUserId: event.currentTarget.dataset.replyUserId,
-        replyUserName: event.currentTarget.dataset.replyUserName
+    this.setData({
+      replyId: event.currentTarget.dataset.replyId,
+      replyUserId: event.currentTarget.dataset.replyUserId,
+      replyUserName: event.currentTarget.dataset.replyUserName
 
-      })
+    })
+
+    user.checkLoginAndNav().then(() => {
+      if (this.data.openComment == false) {
+        this.setData({
+          openComment: !this.data.openComment
+        });
+      }
+    })
 
-      user.checkLoginAndNav().then(() => {
-        if (this.data.openComment == false) {
-          this.setData({
-            openComment: !this.data.openComment
-          });
-        }
-      })
-    
 
 
   },
 
-  switchDeletetPop: function (event) {
+  switchDeletetPop: function(event) {
     let that = this
     user.checkLoginAndNav().then(() => {
       if (this.data.openDelete == false) {
@@ -204,7 +204,7 @@ Page({
     });
   },
 
-  closeDelete: function () {
+  closeDelete: function() {
     this.setData({
 
       openDelete: false,
@@ -275,10 +275,10 @@ Page({
         });
     })
   },
-  preview: function (event) {
+  preview: function(event) {
     let url = event.currentTarget.dataset.url
     let urls = []
-    for (var i in this.data.gallery){
+    for (var i in this.data.gallery) {
       urls.push(this.data.gallery[i].imgUrl)
     }
 
@@ -288,6 +288,18 @@ Page({
     })
     console.log(url)
   },
+  want: function() {
+    util.request(api.GoodsWant + '/' + this.data.id + '/' + this.data.seller.openId, {}, "POST")
+    .then(function(res) {
+      if (res.errno == 0) {
+        wx.navigateTo({
+          url: '/pages/chat/chatForm/chatForm?id=' + res.data,
+        })
+      }else{
+        console.log(res)
+      }
+    })
+  },
 
   onReachBottom: function() {
     console.log("拉到底")

+ 1 - 1
wx-front/pages/goods/goods.wxml

@@ -171,6 +171,6 @@
   <!-- <view class="c">立即购买</view> -->
   <view class="r" wx:if='{{!goods.isSelling}}' bindtap="addToCart">该商品已出售</view>
   <view class="r" wx:elif="{{isSeller && !goods.isDelete && goods.isSelling}}" bindtap="switchDeletetPop">删除该商品</view>
-  <view class="r" wx:else bindtap="addToCart">想要</view>
+  <view class="r" wx:else bindtap="want">想要</view>
 
 </view>

+ 82 - 73
wx-front/services/websocket.js

@@ -5,7 +5,6 @@ const util = require('../utils/util.js');
 var SocketTask
 var socketOpen = false
 var badge = 0
-var newMsgList  = []
 
 
 /**
@@ -19,9 +18,9 @@ function wsConnect() {
   return new Promise(function(resolve, reject) {
     SocketTask = wx.connectSocket({
       url: api.ChatWs + '/' + openId,
-      data: 'data',
       header: {
-        'content-type': 'application/json'
+        'content-type': 'application/json',
+        'Authorization': wx.getStorageSync('token')
       },
       method: 'post',
       success: function(res) {
@@ -43,6 +42,9 @@ function wsConnect() {
   })
 }
 
+function wsClose() {
+  wx.closeSocket()
+}
 /**
  * 监听websocket状态
  */
@@ -56,14 +58,14 @@ function socketTask(SocketTask) {
   SocketTask.onClose(onClose => {
     console.log('监听 WebSocket 连接关闭事件。', onClose)
     socketOpen = false;
-    that.wsConnect()
+    // that.wsConnect()
   })
   SocketTask.onError(onError => {
     console.log('监听 WebSocket 错误。错误信息', onError)
     socketOpen = false
   })
   SocketTask.onMessage(onMessage => {
-    // console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data))
+    console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data))
   })
 }
 
@@ -88,56 +90,53 @@ function sendMessage(data) {
   })
 }
 
-/**
- * 初始化badge未读数
- */
-function initBadge() {
-  return new Promise(function(resolve, reject) {
-    wx.onSocketMessage(onMessage => {
-      var res = JSON.parse(onMessage.data)
-      if (res.errno === 0) {
-        if (res.data.messageType == 3 && res.data.messageBody != 0) {
-          badge = res.data.messageBody
-          wx.setTabBarBadge({
-            index: 3,
-            text: badge
-          })
 
-          resolve("初始化未读数badge : " + badge)
-        }
-      } else {
-        console.log(res)
-        reject(res)
-      }
-    })
-  })
-}
+
+
 function listenBadge() {
   // return new Promise(function (resolve, reject) {
-    wx.onSocketMessage(onMessage => {
-      var res = JSON.parse(onMessage.data)
-      if (res.errno === 0) {
-        if (res.data.messageType == 3 && res.data.messageBody != 0) {
-          badge = res.data.messageBody
-          wx.setTabBarBadge({
-            index: 3,
-            text: badge+""
-          })
+  wx.onSocketMessage(onMessage => {
+    var res = JSON.parse(onMessage.data)
+    if (res.errno === 0) {
+      if (res.data.messageType == 3 && res.data.messageBody != 0) {
+        badge = res.data.messageBody
+        wx.setTabBarBadge({
+          index: 3,
+          text: badge + ""
+        })
 
-          console.log("初始化未读数badge : " + badge)
-        } else if (res.data.messageType == 1){
-          badge++
-          wx.setTabBarBadge({
-            index: 3,
-            text: badge + ""
-          })
-          console.log("接收到新消息,更新badge : " + badge)
-        }
-      } else {
-        console.log(res)
-        reject(res)
+        console.log("初始化未读数badge : " + badge)
+      } else if (res.data.messageType == 1) {
+        badge++
+        wx.setTabBarBadge({
+          index: 3,
+          text: badge + ""
+        })
+        console.log("接收到新消息,更新badge : " + badge)
       }
-    })
+    } else if (res.errno == 3002 || res.errno == 3003 || res.errno == 3004 || res.errno == 3005) {
+      console.log(res.errmsg)
+      //TOKEN_IS_EMPTY
+      //需要登录后才可以操作
+      wx.getSetting({
+        success: res => {
+          if (res.authSetting['scope.userInfo']) {
+            // // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
+            util.getUserInfo().then((res) => {
+              util.backendLogin(res).then((res) => {
+                wsConnect()
+                console.log('再次请求')
+              })
+            })
+
+          }
+        }
+      })
+    }else {
+      console.log(res)
+      reject(res)
+    }
+  })
   // })
 }
 
@@ -151,12 +150,21 @@ function listenChatForm(chatId) {
       if (res.errno === 0) {
         if (res.data.messageType == 1 && res.data.chatId == chatId) {
           console.log("消息Form监听到新消息 : " + res.data.messageBody)
-          var newMsg = res.data
-          newMsgList.push(newMsg)
-          console.log(newMsgList)
-          resolve(newMsg)
+          // var newMsg = res.data
+          // newMsgList.push(newMsg)
+          // console.log(newMsgList)
+          //test
+          util.request(api.ChatFlushUnread + '/' + chatId, {}, "POST").then((res) => {
+            if (res.errno == 0) {
+              console.log("把unread刷入数据库成功")
+
+            } else {
+              console.log(res)
+            }
+          })
+          resolve(res.data)
         }
-      } else {
+      }  else {
         console.log(res)
         reject(res)
       }
@@ -164,22 +172,22 @@ function listenChatForm(chatId) {
   })
 }
 
-/**
- * 关闭对form页的监听,其实就是把期间收到的消息刷入数据库
- */
-function stopListenForm(chatId){
-  if (newMsgList.length > 0){
-    newMsgList = []
-    util.request(api.ChatFlushUnread + '/' + chatId, {},"POST").then((res) => {
-      if(res.errno == 0){
-        console.log("把unread刷入数据库成功")
-        
-      }else{
-        console.log(res)
-      }
-    })
-  }
-}
+// /**
+//  * 关闭对form页的监听,其实就是把期间收到的消息刷入数据库
+//  */
+// function stopListenForm(chatId) {
+//   if (newMsgList.length > 0) {
+//     newMsgList = []
+//     util.request(api.ChatFlushUnread + '/' + chatId, {}, "POST").then((res) => {
+//       if (res.errno == 0) {
+//         console.log("把unread刷入数据库成功")
+
+//       } else {
+//         console.log(res)
+//       }
+//     })
+//   }
+// }
 
 /**
  * 消息列表页监听消息
@@ -209,7 +217,8 @@ function listenChatIndex() {
 
 function lessBadge(less) {
   badge = badge - less
-  if (badge == 0) {
+  if (badge <= 0) {
+    badge = 0
     wx.removeTabBarBadge({
       index: 3,
     })
@@ -230,5 +239,5 @@ module.exports = {
   listenChatIndex,
   lessBadge,
   listenBadge,
-  stopListenForm,
+  // stopListenForm,
 };

+ 1 - 1
wx-front/utils/util.js

@@ -38,7 +38,7 @@ function request(url, data = {}, method = "GET") {
         console.log("success");
 
         if (res.statusCode == 200) {
-          if (res.data.errno == 3003 || res.data.errno == 3004 || res.data.errno == 3005) {
+          if (res.data.errno == 3002 || res.data.errno == 3003 || res.data.errno == 3004 || res.data.errno == 3005) {
             console.log(res.data.errmsg)
             //TOKEN_IS_EMPTY
             //需要登录后才可以操作

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

@@ -58,6 +58,12 @@ zuul:
       serviceId: goods-service
       strip-prefix: false
       sensitiveHeaders:
+    #chat
+    chat:
+      path: /chat/**
+      serviceId: im-service
+      strip-prefix: false
+      sensitiveHeaders: