فهرست منبع

1、弹幕工具对接
2、登录接口新增字段

赵航 1 سال پیش
والد
کامیت
17ca128138
22فایلهای تغییر یافته به همراه171 افزوده شده و 244 حذف شده
  1. 5 0
      pom.xml
  2. 53 0
      src/main/java/com/hy/common/websocket/AbstractWebSocketServer.java
  3. 0 27
      src/main/java/com/hy/modules/bz/daemon/WebSocketListenerInitializer.java
  4. 0 17
      src/main/java/com/hy/modules/bz/daemon/websocket/WebSocketClient.java
  5. 0 24
      src/main/java/com/hy/modules/bz/daemon/websocket/WebSocketClientManager.java
  6. 0 31
      src/main/java/com/hy/modules/bz/daemon/websocket/impl/TiktokMessageWebSocketClient.java
  7. 0 5
      src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/ChatMessage.java
  8. 0 21
      src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/GiftMessage.java
  9. 0 14
      src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/LikeMessage.java
  10. 0 4
      src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/MemberMessage.java
  11. 0 23
      src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/Message.java
  12. 0 5
      src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/MessageDecoder.java
  13. 0 56
      src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/MessageTypeEn.java
  14. 1 1
      src/main/java/com/hy/modules/bz/domain/BzAnchorStudio.java
  15. 9 0
      src/main/java/com/hy/modules/bz/service/IBzAnchorStudioService.java
  16. 22 0
      src/main/java/com/hy/modules/bz/service/impl/BzAnchorStudioServiceImpl.java
  17. 5 0
      src/main/java/com/hy/modules/bz/webapi/dto/LoginInfoDto.java
  18. 30 13
      src/main/java/com/hy/modules/bz/webapi/service/impl/WebApiServiceImpl.java
  19. 43 0
      src/main/java/com/hy/modules/bz/websocket/BarrageWebSocketServer.java
  20. 1 1
      src/main/resources/static/editor-app/editor/i18n/translation_signavio_en_us.js
  21. 1 1
      src/main/resources/static/editor-app/libs/json3_3.2.6/lib/json3.js
  22. 1 1
      src/main/resources/static/editor-app/libs/prototype-1.5.1.js

+ 5 - 0
pom.xml

@@ -78,6 +78,11 @@
 
     <!-- 依 赖 管 理 -->
     <dependencies>
+        <!-- websocket -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
         <!-- Web 模块 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 53 - 0
src/main/java/com/hy/common/websocket/AbstractWebSocketServer.java

@@ -0,0 +1,53 @@
+package com.hy.common.websocket;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+
+public abstract class AbstractWebSocketServer extends TextWebSocketHandler {
+
+    private final Logger logger = LoggerFactory.getLogger(AbstractWebSocketServer.class);
+
+    protected boolean enableMessageLog = false;
+
+    public abstract void handleOpen(WebSocketSession session);
+
+    public abstract void handleClose(WebSocketSession session);
+
+    public abstract void handleMessage(String message, WebSocketSession session);
+
+    public abstract void handleError(WebSocketSession session, Throwable error);
+
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+        super.afterConnectionEstablished(session);
+        logger.info("websocket client connected,sessionId: %s, client address: %s",session.getId(), session.getRemoteAddress().getAddress().getHostAddress());
+        handleOpen(session);
+    }
+
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
+        super.afterConnectionClosed(session, status);
+        logger.info("websocket client disconnected,sessionId: %s, client address: %s",session.getId(), session.getRemoteAddress().getAddress().getHostAddress());
+        handleClose(session);
+    }
+
+    @Override
+    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+        super.handleTransportError(session, exception);
+        logger.error(String.format("websocket error,sessionId: %s, client address: %s",session.getId(), session.getRemoteAddress().getAddress().getHostAddress()), exception);
+        handleError(session, exception);
+    }
+
+    @Override
+    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+        super.handleTextMessage(session, message);
+        if(enableMessageLog){
+            logger.info("websocket client message,sessionId: %s, client address: %s, message: %s",session.getId(), session.getRemoteAddress().getAddress().getHostAddress(), message);
+        }
+        handleMessage(message.getPayload(), session);
+    }
+}

+ 0 - 27
src/main/java/com/hy/modules/bz/daemon/WebSocketListenerInitializer.java

@@ -1,27 +0,0 @@
-package com.hy.modules.bz.daemon;
-
-import com.hy.modules.bz.daemon.websocket.WebSocketClientManager;
-import com.hy.modules.bz.daemon.websocket.impl.TiktokMessageWebSocketClient;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-
-@Component
-public class WebSocketListenerInitializer {
-
-    @Value("hy.web-socket.uri.tiktok")
-    private String tiktokWebsocketURI;
-
-    @PostConstruct
-    public void init(){
-        try {
-            WebSocketClientManager.getInstance().startListen(tiktokWebsocketURI, TiktokMessageWebSocketClient.class);
-        } catch (Exception e) {
-            e.printStackTrace();
-            // throw new RuntimeException(e);
-        }
-    }
-
-
-}

+ 0 - 17
src/main/java/com/hy/modules/bz/daemon/websocket/WebSocketClient.java

@@ -1,17 +0,0 @@
-package com.hy.modules.bz.daemon.websocket;
-
-import javax.websocket.CloseReason;
-import javax.websocket.EndpointConfig;
-import javax.websocket.Session;
-
-/**
- * web socket 接口
- */
-public interface WebSocketClient {
-
-    void onOpen(Session session, EndpointConfig config);
-
-    void onMessage(Session session, String message);
-
-    void onClose(Session session, CloseReason closeReason);
-}

+ 0 - 24
src/main/java/com/hy/modules/bz/daemon/websocket/WebSocketClientManager.java

@@ -1,24 +0,0 @@
-package com.hy.modules.bz.daemon.websocket;
-
-import javax.websocket.ContainerProvider;
-import javax.websocket.WebSocketContainer;
-import java.net.URI;
-
-public class WebSocketClientManager {
-
-    private static final WebSocketContainer CONTAINER = ContainerProvider.getWebSocketContainer();
-
-    private static final WebSocketClientManager WEB_SOCKET_LISTENER = new WebSocketClientManager();
-    private WebSocketClientManager() {
-    }
-
-    public static WebSocketClientManager getInstance() {
-        return WEB_SOCKET_LISTENER;
-    }
-
-    public void startListen(String uri, Class<? extends WebSocketClient> clz) throws Exception {
-        CONTAINER.connectToServer(clz, URI.create(uri));
-    }
-
-
-}

+ 0 - 31
src/main/java/com/hy/modules/bz/daemon/websocket/impl/TiktokMessageWebSocketClient.java

@@ -1,31 +0,0 @@
-package com.hy.modules.bz.daemon.websocket.impl;
-
-import com.hy.modules.bz.daemon.websocket.WebSocketClient;
-import com.hy.modules.bz.daemon.websocket.impl.tiktok.Message;
-import com.hy.modules.bz.daemon.websocket.impl.tiktok.MessageTypeEn;
-
-import javax.websocket.*;
-
-@ClientEndpoint
-public class TiktokMessageWebSocketClient implements WebSocketClient {
-
-    @OnOpen
-    @Override
-    public void onOpen(Session session, EndpointConfig config) {
-
-    }
-
-    @OnMessage
-    @Override
-    public void onMessage(Session session, String message) {
-        // todo: 接收消息
-        Message msgObj = MessageTypeEn.fromMessage(message).decode(message);
-    }
-
-    @OnClose
-    @Override
-    public void onClose(Session session, CloseReason closeReason) {
-
-    }
-
-}

+ 0 - 5
src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/ChatMessage.java

@@ -1,5 +0,0 @@
-package com.hy.modules.bz.daemon.websocket.impl.tiktok;
-
-public class ChatMessage extends Message {
-
-}

+ 0 - 21
src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/GiftMessage.java

@@ -1,21 +0,0 @@
-package com.hy.modules.bz.daemon.websocket.impl.tiktok;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import lombok.Data;
-
-@Data
-public class GiftMessage extends Message {
-
-    @JSONField(name = "giftId")
-    private String giftId;
-
-    @JSONField(name = "giftName")
-    private String giftName;
-
-    @JSONField(name = "giftCount")
-    private int giftCount;
-
-    @JSONField(name = "repeatEnd")
-    private int repeatEnd;
-
-}

+ 0 - 14
src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/LikeMessage.java

@@ -1,14 +0,0 @@
-package com.hy.modules.bz.daemon.websocket.impl.tiktok;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import lombok.Data;
-
-@Data
-public class LikeMessage extends Message {
-
-    @JSONField(name = "count")
-    private int count;
-
-    @JSONField(name = "total")
-    private int total;
-}

+ 0 - 4
src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/MemberMessage.java

@@ -1,4 +0,0 @@
-package com.hy.modules.bz.daemon.websocket.impl.tiktok;
-
-public class MemberMessage extends Message{
-}

+ 0 - 23
src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/Message.java

@@ -1,23 +0,0 @@
-package com.hy.modules.bz.daemon.websocket.impl.tiktok;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import lombok.Data;
-
-@Data
-public class Message {
-
-    @JSONField(name = "type")
-    private String type;
-
-    @JSONField(name = "name")
-    private String name;
-
-    @JSONField(name = "uid")
-    private String uid;
-
-    @JSONField(name = "head_img")
-    private String headImg;
-
-    @JSONField(name = "content")
-    private String content;
-}

+ 0 - 5
src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/MessageDecoder.java

@@ -1,5 +0,0 @@
-package com.hy.modules.bz.daemon.websocket.impl.tiktok;
-
-public interface MessageDecoder {
-    <T extends Message> T decode(String message);
-}

+ 0 - 56
src/main/java/com/hy/modules/bz/daemon/websocket/impl/tiktok/MessageTypeEn.java

@@ -1,56 +0,0 @@
-package com.hy.modules.bz.daemon.websocket.impl.tiktok;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-
-/**
- * tiktok 消息类型
- */
-public enum MessageTypeEn implements MessageDecoder {
-
-    MEMBER("MemberMessage",MemberMessage.class),
-    CHAT("ChatMessage",ChatMessage.class),
-    LIKE("LikeMessage",LikeMessage.class),
-    GIFT("GiftMessage",GiftMessage.class),;
-
-    private String value;
-
-    private Class<? extends Message> clz;
-
-    MessageTypeEn(String _value,Class<? extends Message> _clz) {
-        value = _value;
-        clz = _clz;
-    }
-
-    public static MessageTypeEn getEnum(String value) {
-        for (MessageTypeEn en : MessageTypeEn.values()) {
-            if (en.value.equals(value)) {
-                return en;
-            }
-        }
-        throw new IllegalArgumentException(value);
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public <T extends Message> Class<T> getClz() {
-        return (Class<T>) clz;
-    }
-
-    public static MessageTypeEn fromMessage(String message){
-        JSONObject obj = JSONObject.parseObject(message);
-        String key = "type";
-        if(!obj.containsKey(key)){
-            throw new IllegalArgumentException("");
-        }
-
-        return getEnum(obj.getString(key));
-    }
-
-    @Override
-    public <T extends Message> T decode(String message) {
-        return JSON.parseObject(message,getClz());
-    }
-}

+ 1 - 1
src/main/java/com/hy/modules/bz/domain/BzAnchorStudio.java

@@ -35,7 +35,7 @@ public class BzAnchorStudio extends BaseDomain{
     /** 下播时间 */
     private Date closeTime;
 
-    /** 直播间状态 */
+    /** 直播间状态 open/closed */
     private String status;
 
     /** 主播ID */

+ 9 - 0
src/main/java/com/hy/modules/bz/service/IBzAnchorStudioService.java

@@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo;
 import com.hy.common.web.domain.request.PageDomain;
 import com.hy.modules.bz.domain.BzAnchorStudio;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.hy.modules.bz.domain.BzPlayer;
 
 /**
  * 主播直播间列表查询刷新Service接口
@@ -21,4 +22,12 @@ public interface IBzAnchorStudioService extends IService<BzAnchorStudio> {
      * */
     PageInfo<BzAnchorStudio> selectBzAnchorStudioPage(BzAnchorStudio bzAnchorStudio, PageDomain pageDomain);
 
+    /**
+     * 主播开播
+     * @param player
+     * @param roomId
+     * @param game
+     * @return
+     */
+    BzAnchorStudio startStudio(BzPlayer player, String roomId, String game);
 }

+ 22 - 0
src/main/java/com/hy/modules/bz/service/impl/BzAnchorStudioServiceImpl.java

@@ -1,16 +1,21 @@
 package com.hy.modules.bz.service.impl;
 
+import java.util.Date;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.hy.common.web.domain.request.PageDomain;
+import com.hy.modules.bz.domain.BzPlayer;
+import com.hy.modules.bz.service.IBzPlayerService;
 import org.springframework.stereotype.Service;
 import com.hy.modules.bz.mapper.BzAnchorStudioMapper;
 import com.hy.modules.bz.domain.BzAnchorStudio;
 import com.hy.modules.bz.service.IBzAnchorStudioService;
 
+import javax.annotation.Resource;
+
 /**
  * 主播直播间列表查询刷新Service业务层处理
  *
@@ -34,4 +39,21 @@ public class BzAnchorStudioServiceImpl extends ServiceImpl<BzAnchorStudioMapper,
         return new PageInfo<>(data);
     }
 
+    @Override
+    public BzAnchorStudio startStudio(BzPlayer player, String roomId, String game) {
+        BzAnchorStudio bzAnchorStudio = new BzAnchorStudio();
+        bzAnchorStudio.setAnchorId(player.getId());
+        bzAnchorStudio.setAnchorName(player.getCardNo());
+        bzAnchorStudio.setAnchorNickName(player.getCardNo());
+        bzAnchorStudio.setGameName(game);
+        bzAnchorStudio.setRoomId(roomId);
+        bzAnchorStudio.setPlatform(player.getPlatform());
+        bzAnchorStudio.setOpenTime(new Date());
+        bzAnchorStudio.setStatus("open");
+        if (save(bzAnchorStudio)) {
+            return bzAnchorStudio;
+        }
+        throw new RuntimeException("主播直播间开启失败");
+    }
+
 }

+ 5 - 0
src/main/java/com/hy/modules/bz/webapi/dto/LoginInfoDto.java

@@ -19,6 +19,11 @@ public class LoginInfoDto implements Serializable {
      */
     private String cardPwd;
 
+    /**
+     * 哪个游戏
+     */
+    private String game;
+
     /**
      * 时间戳 必传
      */

+ 30 - 13
src/main/java/com/hy/modules/bz/webapi/service/impl/WebApiServiceImpl.java

@@ -3,9 +3,12 @@ package com.hy.modules.bz.webapi.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.hy.common.tools.EncodeUtils;
 import com.hy.modules.bz.domain.BzPlayer;
+import com.hy.modules.bz.service.IBzAnchorStudioService;
 import com.hy.modules.bz.service.IBzPlayerService;
 import com.hy.modules.bz.webapi.dto.*;
 import com.hy.modules.bz.webapi.service.WebApiService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
@@ -18,30 +21,44 @@ import java.util.UUID;
 @Service
 public class WebApiServiceImpl implements WebApiService {
 
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
     private static final String TOKEN_PRIFIX = "user:";
 
     @Resource
     private IBzPlayerService playerService;
 
+    @Resource
+    private IBzAnchorStudioService anchorStudioService;
+
     @Resource
     private StringRedisTemplate stringRedisTemplate;
 
     @Override
     public LoginResultDto login(LoginInfoDto loginInfo) {
-        QueryWrapper<BzPlayer> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("card_no",loginInfo.getCardNo())
-                        .eq("card_password",loginInfo.getCardPwd())
-                                .eq("status","normal");
-        BzPlayer player = playerService.getOne(queryWrapper,false);
-        Assert.notNull(player,"No player found");
 
-        String toEncode = UUID.randomUUID().toString().concat(String.valueOf(loginInfo.getTimestamp()));
-        String token = EncodeUtils.customBase64Encode(toEncode);
-        stringRedisTemplate.opsForValue().set(TOKEN_PRIFIX.concat(loginInfo.getCardNo()),token);
-        LoginResultDto loginResultDto = new LoginResultDto();
-        loginResultDto.setToken(token);
-        loginResultDto.setCardNo(loginResultDto.getCardNo());
-        return loginResultDto;
+        try{
+            QueryWrapper<BzPlayer> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("card_no",loginInfo.getCardNo())
+                    .eq("card_password",loginInfo.getCardPwd())
+                    .eq("status","normal");
+            BzPlayer player = playerService.getOne(queryWrapper,false);
+            Assert.notNull(player,"No player found");
+
+            String toEncode = UUID.randomUUID().toString().concat(String.valueOf(loginInfo.getTimestamp()));
+            String token = EncodeUtils.customBase64Encode(toEncode);
+            stringRedisTemplate.opsForValue().set(TOKEN_PRIFIX.concat(loginInfo.getCardNo()),token);
+            LoginResultDto loginResultDto = new LoginResultDto();
+            loginResultDto.setToken(token);
+            loginResultDto.setCardNo(loginResultDto.getCardNo());
+            anchorStudioService.startStudio(player,token, loginInfo.getGame());
+
+            return loginResultDto;
+        }catch (Exception ex){
+            logger.error(String.format("登录失败,账号: %s, 密码: %s",loginInfo.getCardNo(),loginInfo.getCardPwd()),ex);
+            stringRedisTemplate.delete(TOKEN_PRIFIX.concat(loginInfo.getCardNo()));
+            throw new RuntimeException(ex);
+        }
     }
 
     @Override

+ 43 - 0
src/main/java/com/hy/modules/bz/websocket/BarrageWebSocketServer.java

@@ -0,0 +1,43 @@
+package com.hy.modules.bz.websocket;
+
+import com.hy.common.websocket.AbstractWebSocketServer;
+import com.hy.modules.bz.service.IBzAnchorStudioService;
+import com.hy.modules.bz.service.IBzGiftRecordService;
+import com.hy.modules.bz.service.IBzPlayerService;
+import org.springframework.web.socket.WebSocketSession;
+
+import javax.annotation.Resource;
+
+public class BarrageWebSocketServer extends AbstractWebSocketServer {
+
+    private static final String PLATFORM = "tiktok";
+
+    @Resource
+    private IBzPlayerService playerService;
+
+    @Resource
+    private IBzAnchorStudioService anchorStudioService;
+
+    @Resource
+    private IBzGiftRecordService giftRecordService;
+
+    @Override
+    public void handleOpen(WebSocketSession session) {
+
+    }
+
+    @Override
+    public void handleClose(WebSocketSession session) {
+
+    }
+
+    @Override
+    public void handleMessage(String message, WebSocketSession session) {
+
+    }
+
+    @Override
+    public void handleError(WebSocketSession session, Throwable error) {
+
+    }
+}

+ 1 - 1
src/main/resources/static/editor-app/editor/i18n/translation_signavio_en_us.js

@@ -47,7 +47,7 @@ if (!Signavio.I18N.Editor.Linking) {
 }
 Signavio.I18N.Editor.Linking.CreateDiagram = "Create a new diagram";
 Signavio.I18N.Editor.Linking.UseDiagram = "Use existing diagram";
-Signavio.I18N.Editor.Linking.UseLink = "Use web link";
+Signavio.I18N.Editor.Linking.UseLink = "Use websocket link";
 Signavio.I18N.Editor.Linking.Close = "Close";
 Signavio.I18N.Editor.Linking.Cancel = "Cancel";
 Signavio.I18N.Editor.Linking.UseName = "Adopt diagram name";

+ 1 - 1
src/main/resources/static/editor-app/libs/json3_3.2.6/lib/json3.js

@@ -20,7 +20,7 @@
         JSON3.stringify = nativeJSON.stringify;
         JSON3.parse = nativeJSON.parse;
     } else {
-        // Export for web browsers, JavaScript engines, and asynchronous module
+        // Export for websocket browsers, JavaScript engines, and asynchronous module
         // loaders, using the global `JSON` object if available.
         JSON3 = window.JSON = nativeJSON || {};
     }

+ 1 - 1
src/main/resources/static/editor-app/libs/prototype-1.5.1.js

@@ -2,7 +2,7 @@
  *  (c) 2005-2007 Sam Stephenson
  *
  *  Prototype is freely distributable under the terms of an MIT-style license.
- *  For details, see the Prototype web site: http://www.prototypejs.org/
+ *  For details, see the Prototype websocket site: http://www.prototypejs.org/
  *
 /*--------------------------------------------------------------------------*/