Sfoglia il codice sorgente

Merge branch 'feature/0511-live' into saas

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
#	mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
shangke 1 anno fa
parent
commit
e36410ab3c
31 ha cambiato i file con 1920 aggiunte e 349 eliminazioni
  1. 1 0
      .gitignore
  2. 585 0
      .idea/httpRequests/http-requests-log.http
  3. 152 148
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java
  4. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveBroadcastRoomMemberDao.java
  5. 23 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java
  6. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java
  7. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoomMember.java
  8. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveRoomBlack.java
  9. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/live/ELiveViewMode.java
  10. 60 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomMemberVo.java
  11. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomVo.java
  12. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/RoomUserInfoVo.java
  13. 42 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java
  14. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  15. 112 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomMemberServiceImpl.java
  16. 407 41
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  17. 19 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomBlackServiceImpl.java
  18. 2 0
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml
  19. 49 24
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMemberMapper.xml
  20. 3 2
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomBlackMapper.xml
  21. 2 0
      mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml
  22. 1 2
      mec-biz/src/main/resources/config/mybatis/SysUserCashAccountMapper.xml
  23. 1 1
      mec-common/common-core/pom.xml
  24. 100 83
      mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
  25. 40 29
      mec-common/common-core/src/main/java/com/ym/mec/common/exception/BizException.java
  26. 1 0
      mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java
  27. 5 2
      mec-student/src/main/java/com/ym/mec/student/controller/ImLiveBroadcastRoomController.java
  28. 104 0
      mec-student/src/main/java/com/ym/mec/student/controller/open/OpenLiveBroadcastRoomController.java
  29. 37 0
      mec-student/src/main/java/com/ym/mec/student/controller/open/OpenSysConfigController.java
  30. 2 0
      mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomMemberController.java
  31. 1 1
      mec-web/src/main/resources/bootstrap-local.properties

+ 1 - 0
.gitignore

@@ -6,6 +6,7 @@
 .settings
 .project
 *.iml
+*.log
 /lib/
 
 ### 忽略子模块的文件 ###

+ 585 - 0
.idea/httpRequests/http-requests-log.http

@@ -0,0 +1,585 @@
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248479&microphoneFlag=false
+Authorization: bearer aeec0ea9-4079-4765-aa72-346a7d37e735
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T175057.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248479&microphoneFlag=true
+Authorization: bearer aeec0ea9-4079-4765-aa72-346a7d37e735
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T175049.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248479&microphoneFlag=false
+Authorization: bearer aeec0ea9-4079-4765-aa72-346a7d37e735
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T175037.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248479&microphoneFlag=false
+Authorization: bearer aeec0ea9-4079-4765-aa72-346a7d37e735
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T174858.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248479&microphoneFlag=false
+Authorization: bearer aeec0ea9-4079-4765-aa72-346a7d37e735
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T174628.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 100
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e
+
+<> 2023-05-19T174545.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248380&microphoneFlag=false
+Authorization: bearer b4d5c0d2-3faf-48f3-a5d6-6301cc1e1af6
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T174527.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248380&microphoneFlag=false
+Authorization: bearer b4d5c0d2-3faf-48f3-a5d6-6301cc1e1af6
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T174458.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248380&microphoneFlag=false
+Authorization: bearer b4d5c0d2-3faf-48f3-a5d6-6301cc1e1af6
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T174300.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248380&microphoneFlag=false
+Authorization: bearer b4d5c0d2-3faf-48f3-a5d6-6301cc1e1af6
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T174052.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Authorization: bearer fcf13dd1-6f06-40ae-a36e-22b4df4d5d01
+Content-Type: application/json
+Content-Length: 45
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+  "roomUid": "LIVE-2248336-1684474334299"
+}
+
+<> 2023-05-19T173652.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Authorization: bearer fcf13dd1-6f06-40ae-a36e-22b4df4d5d01
+Content-Type: application/json
+Content-Length: 45
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{
+  "roomUid": "LIVE-2248336-1684474334299"
+}
+
+<> 2023-05-19T173417.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Authorization: bearer fcf13dd1-6f06-40ae-a36e-22b4df4d5d01
+Content-Type: application/json
+Content-Length: 2
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{}
+
+<> 2023-05-19T173333.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Authorization: bearer fcf13dd1-6f06-40ae-a36e-22b4df4d5d01
+Content-Length: 2
+Content-Type: */*; charset=UTF-8
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{}
+
+<> 2023-05-19T173320.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Authorization: bearer fcf13dd1-6f06-40ae-a36e-22b4df4d5d01
+Content-Length: 0
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T173307.200.json
+
+###
+
+GET http://127.0.0.1:9001/imLiveBroadcastRoom/joinRoom?roomUid=LIVE-2248336-1684474334299&userId=2248380&microphoneFlag=false
+Authorization: bearer b4d5c0d2-3faf-48f3-a5d6-6301cc1e1af6
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T173156.200.json
+
+###
+
+POST http://localhost:9001/user/update
+Authorization: bearer b4d5c0d2-3faf-48f3-a5d6-6301cc1e1af6
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 45
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+username=ces&currentClass=1&currentGradeNum=3
+
+<> 2023-05-19T172903.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 111
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=1
+
+<> 2023-05-19T172200.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 111
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=1
+
+<> 2023-05-19T172138.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 111
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=1
+
+<> 2023-05-19T172025.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 111
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=1
+
+<> 2023-05-19T171911.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 111
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=1
+
+<> 2023-05-19T171355.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 111
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=1
+
+<> 2023-05-19T171229.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 111
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=1
+
+<> 2023-05-19T171144.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 111
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=1
+
+<> 2023-05-19T171124.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 114
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+clientId=student&clientSecret=student&phone=19900990088&smsCode=666666&deviceNum=190e35f7e15650ef33e&isLessee=true
+
+<> 2023-05-19T171047.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin?clientId=student&clientSecret=student&phone=19900880088&smsCode=666666&isLessee=true
+Content-Type: application/x-www-form-urlencoded
+Content-Length: 0
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T170945.200.json
+
+###
+
+POST http://127.0.0.1:8001/smsLogin?clientId=student&clientSecret=student&phone=19900880088&smsCode=666666&isLessee=true
+Content-Type: application/json
+Content-Length: 0
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-19T170850.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorFingerprint?code=0413aiGa1MplkF0RyGGa1sf6S143aiGv
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-18T145501.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorFingerprint?code=0413aiGa1MplkF0RyGGa1sf6S143aiGv
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-18T145309.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/sysConfig/queryByParamName?paramName=wechat_appid
+Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-17T183050.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 82
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248324-1683860932420", "excludeBlacklist": 0}
+
+<> 2023-05-12T191018.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 82
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248324-1683860932420", "excludeBlacklist": 1}
+
+<> 2023-05-12T191000.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 59
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248475-1683777517444"}
+
+<> 2023-05-12T190114.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 59
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248475-1683777517444"}
+
+<> 2023-05-12T185307.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 59
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248475-1683777517444"}
+
+<> 2023-05-12T184904.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 59
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248475-1683777517444"}
+
+<> 2023-05-12T184725.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 59
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248475-1683777517444"}
+
+<> 2023-05-12T184519.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 59
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248475-1683777517444"}
+
+<> 2023-05-12T184412.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 59
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248475-1683777517444"}
+
+<> 2023-05-12T183529.200.json
+
+###
+
+POST http://127.0.0.1:8005/imLiveBroadcastRoomMember/queryRoomMember
+Content-Type: application/json
+Authorization: bearer 70c30cec-f77c-4871-beaa-ce4b5224bf3e
+Content-Length: 59
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+{"rows":10,"page":1,"roomUid":"LIVE-2248475-1683777517444"}
+
+<> 2023-05-12T183456.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorRoomInfo?roomUid=LIVE-2248475-1683777517444&userId=10001
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T204659.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorCredentials?roomUid=LIVE-2248475-1683777517444&fingerprint=111111112
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T204644.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorJoinRoom?roomUid=LIVE-2248475-1683777517444&userId=10000
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T204620.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorRoomInfo?roomUid=LIVE-2248475-1683777517444&userId=10000
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T204529.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorCredentials?roomUid=LIVE-2248475-1683777517444&fingerprint=111111111
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T204510.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorCredentials?roomUid=LIVE-2248475-1683777517444&fingerprint=111111112
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T203037.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorCredentials?roomUid=LIVE-2248475-1683777517444&fingerprint=111111111
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T203024.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorCredentials?roomUid=LIVE-2248475-1683777517444&fingerprint=111111111
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T203016.200.json
+
+###
+
+GET http://127.0.0.1:9001/open/liveBroadcastRoom/visitorCredentials?roomUid=LIVE-2248475-1683777517444&fingerprint=111111111
+Proxy-Connection: Keep-Alive
+User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.6)
+Accept-Encoding: br,deflate,gzip,x-gzip
+
+<> 2023-05-11T202954.200.json
+
+###
+

+ 152 - 148
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java

@@ -26,156 +26,160 @@ import com.ym.mec.common.service.IdGeneratorService;
 
 public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider {
 
-	private UserDetailsService userDetailsService;
-
-	private IdGeneratorService smsCodeService;
-
-	private SysUserService sysUserService;
-	
-	private SysUserDeviceService sysUserDeviceService;
-
-	private RedisCache<String,Object> redisCache;
-
-	@Override
-	protected void additionalAuthenticationChecks(UserDetails userDetails, Authentication authentication) throws AuthenticationException {
-
-		if (authentication.getCredentials() == null) {
-			throw new BadCredentialsException(this.messages.getMessage("PhoneAuthenticationProvider.badCredentials", "Bad credentials"));
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	protected UserDetails retrieveUser(String username, Authentication authentication) throws AuthenticationException {
-		LoginEntity loginEntity = (LoginEntity) authentication.getCredentials();
-		if (loginEntity == null) {
-			throw new BadCredentialsException("Bad credentials");
-		}
-		String smsCode = loginEntity.getSmsCode();
-		String phone = loginEntity.getPhone();
-		String clientId = loginEntity.getClientId();
-
-		// 验证码验证
-		if (!clientId.startsWith("QR_") && !smsCodeService.verifyValidCode(phone, smsCode)) {
-			throw new BadCredentialsException("验证码校验失败");
-		}
-
-
-		Boolean isRegister = loginEntity.getIsRegister();
-		
-		String deviceNum = loginEntity.getDeviceNum();
-
-
-
-		SysUserInfo userInfo;
-
-		if (clientId.startsWith("QR_")) {
-			Object data = redisCache.get(loginEntity.getPhone());
-			if (data == null) {
-				throw new LockedException("用户不存在");
-			} else {
-				redisCache.delete(loginEntity.getPhone());
-				QRLoginDto loginDto = (QRLoginDto) data;
-				if (loginDto.getPrivateKey().equals(loginEntity.getSmsCode())) {
-					userInfo = loginDto.getUserInfo();
-					username = username.replaceAll(loginDto.getCode(),userInfo.getSysUser().getPhone());
-				} else {
-					throw new LockedException("用户不存在");
-				}
-			}
-		} else {
-			userInfo = sysUserService.queryUserInfoByPhone(phone);
-		}
-
-		if (userInfo == null) {
-			if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
-				throw new LockedException("用户不存在");
-			}
-			
-			userInfo = sysUserService.initUser(loginEntity.getTenantId(), loginEntity.getOrganId(), loginEntity.getPhone(), clientId);
-			
-			if (StringUtils.isNotBlank(deviceNum)) {
-				sysUserDeviceService.bindDevice(clientId, userInfo.getSysUser().getId(), deviceNum, userInfo.getSysUser().getTenantId());
-			}
-		} else {
-			SysUser user = userInfo.getSysUser();
-			if (user == null) {
-				throw new LockedException("用户不存在");
-			}
-			//如果机构不一致,不允许跨机构注册
+    private UserDetailsService userDetailsService;
+
+    private IdGeneratorService smsCodeService;
+
+    private SysUserService sysUserService;
+
+    private SysUserDeviceService sysUserDeviceService;
+
+    private RedisCache<String,Object> redisCache;
+
+    @Override
+    protected void additionalAuthenticationChecks(UserDetails userDetails, Authentication authentication) throws AuthenticationException {
+
+        if (authentication.getCredentials() == null) {
+            throw new BadCredentialsException(this.messages.getMessage("PhoneAuthenticationProvider.badCredentials", "Bad credentials"));
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    protected UserDetails retrieveUser(String username, Authentication authentication) throws AuthenticationException {
+        LoginEntity loginEntity = (LoginEntity) authentication.getCredentials();
+        if (loginEntity == null) {
+            throw new BadCredentialsException("Bad credentials");
+        }
+        String smsCode = loginEntity.getSmsCode();
+        String phone = loginEntity.getPhone();
+        String clientId = loginEntity.getClientId();
+
+        // 验证码验证
+        if (!clientId.startsWith("QR_") && !smsCodeService.verifyValidCode(phone, smsCode)) {
+            throw new BadCredentialsException("验证码校验失败");
+        }
+
+
+        Boolean isRegister = loginEntity.getIsRegister();
+
+        String deviceNum = loginEntity.getDeviceNum();
+
+
+        SysUserInfo userInfo;
+
+        if (clientId.startsWith("QR_")) {
+            Object data = redisCache.get(loginEntity.getPhone());
+            if (data == null) {
+                throw new LockedException("用户不存在");
+            } else {
+                redisCache.delete(loginEntity.getPhone());
+                QRLoginDto loginDto = (QRLoginDto) data;
+                if (loginDto.getPrivateKey().equals(loginEntity.getSmsCode())) {
+                    userInfo = loginDto.getUserInfo();
+                    username = username.replaceAll(loginDto.getCode(),userInfo.getSysUser().getPhone());
+                } else {
+                    throw new LockedException("用户不存在");
+                }
+            }
+        } else {
+            userInfo = sysUserService.queryUserInfoByPhone(phone);
+        }
+
+        if (userInfo == null) {
+            if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
+                throw new LockedException("用户不存在");
+            }
+
+            userInfo = sysUserService.initUser(loginEntity.getTenantId(), loginEntity.getOrganId(), loginEntity.getPhone(), clientId);
+
+            if (StringUtils.isNotBlank(deviceNum)) {
+                sysUserDeviceService.bindDevice(clientId, userInfo.getSysUser().getId(), deviceNum, userInfo.getSysUser().getTenantId());
+            }
+        } else {
+            SysUser user = userInfo.getSysUser();
+            if (user == null) {
+                throw new LockedException("用户不存在");
+            }
+            //如果机构不一致,不允许跨机构注册
 //			if(loginEntity.getTenantId() != null && loginEntity.getTenantId() != 0 &&
 //					!loginEntity.getTenantId().equals(user.getTenantId())){
 //				throw new LockedException("用户已注册");
 //			}
-			if (StringUtils.isNotBlank(deviceNum)) {
-				sysUserDeviceService.bindDevice(clientId, user.getId(), deviceNum, userInfo.getSysUser().getTenantId());
-			}
-
-			if (clientId.startsWith("QR_")) {
-			} else  if (!userInfo.getSysUser().getUserType().contains(clientId)) {
-				if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
-					throw new LockedException("用户不存在");
-				} else {
-					user.setUserType(user.getUserType() + "," + clientId);
-					user.setUpdateTime(new Date());
-
-					// 添加userType以及附加信息
-					if (StringUtils.equals("STUDENT", clientId)) {
-						user.setOrganId(Integer.parseInt(loginEntity.getOrganId()));
-						sysUserService.saveStudent(user.getId(),loginEntity.getTenantId());
-					} else if (StringUtils.equals("TEACHER", clientId)) {
-						sysUserService.saveTeacher(user.getId(),loginEntity.getTenantId());
-					}
-					sysUserService.update(user);
-				}
-			}
-		}
-
-		UserDetails loadedUser;
-		try {
-			loadedUser = userDetailsService.loadUserByUsername(username);
-		} catch (UsernameNotFoundException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new InternalAuthenticationServiceException(e.getMessage(), e);
-		}
-
-		if (loadedUser == null) {
-			throw new InternalAuthenticationServiceException("账户不存在");
-		} else {
-			return loadedUser;
-		}
-	}
-
-	@Override
-	protected Authentication createSuccessAuthentication(Object principal, Authentication authentication, UserDetails user) {
-		PhoneAuthenticationToken result = new PhoneAuthenticationToken(principal, authentication.getCredentials(), user.getAuthorities());
-		result.setDetails(authentication.getDetails());
-		return result;
-	}
-
-	@Override
-	public boolean supports(Class<?> aClass) {
-		return PhoneAuthenticationToken.class.isAssignableFrom(aClass);
-	}
-
-	public void setUserDetailsService(UserDetailsService userDetailsService) {
-		this.userDetailsService = userDetailsService;
-	}
-
-	public void setRedisCache(RedisCache<String, Object> redisCache) {
-		this.redisCache = redisCache;
-	}
-
-	public void setSysUserService(SysUserService sysUserService) {
-		this.sysUserService = sysUserService;
-	}
-
-	public void setSmsCodeService(IdGeneratorService smsCodeService) {
-		this.smsCodeService = smsCodeService;
-	}
-
-	public void setSysUserDeviceService(SysUserDeviceService sysUserDeviceService) {
-		this.sysUserDeviceService = sysUserDeviceService;
-	}
+            if (StringUtils.isNotBlank(deviceNum)) {
+                sysUserDeviceService.bindDevice(clientId, user.getId(), deviceNum, userInfo.getSysUser().getTenantId());
+            }
+
+            if (clientId.startsWith("QR_")) {
+            } else  if (!userInfo.getSysUser().getUserType().contains(clientId)) {
+                if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
+                    throw new LockedException("用户不存在");
+                } else {
+                    user.setUserType(user.getUserType() + "," + clientId);
+                    user.setUpdateTime(new Date());
+
+                    // 添加userType以及附加信息
+                    if (StringUtils.equals("STUDENT", clientId)) {
+                        if (StringUtils.isBlank(loginEntity.getOrganId())) {
+                            user.setOrganId(sysUserService.getLesseeOrganId());
+                            loginEntity.setTenantId(1);
+                        } else {
+                            user.setOrganId(Integer.parseInt(loginEntity.getOrganId()));
+                        }
+                        sysUserService.saveStudent(user.getId(),loginEntity.getTenantId());
+                    } else if (StringUtils.equals("TEACHER", clientId)) {
+                        sysUserService.saveTeacher(user.getId(),loginEntity.getTenantId());
+                    }
+                    sysUserService.update(user);
+                }
+            }
+        }
+
+        UserDetails loadedUser;
+        try {
+            loadedUser = userDetailsService.loadUserByUsername(username);
+        } catch (UsernameNotFoundException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new InternalAuthenticationServiceException(e.getMessage(), e);
+        }
+
+        if (loadedUser == null) {
+            throw new InternalAuthenticationServiceException("账户不存在");
+        } else {
+            return loadedUser;
+        }
+    }
+
+    @Override
+    protected Authentication createSuccessAuthentication(Object principal, Authentication authentication, UserDetails user) {
+        PhoneAuthenticationToken result = new PhoneAuthenticationToken(principal, authentication.getCredentials(), user.getAuthorities());
+        result.setDetails(authentication.getDetails());
+        return result;
+    }
+
+    @Override
+    public boolean supports(Class<?> aClass) {
+        return PhoneAuthenticationToken.class.isAssignableFrom(aClass);
+    }
+
+    public void setUserDetailsService(UserDetailsService userDetailsService) {
+        this.userDetailsService = userDetailsService;
+    }
+
+    public void setRedisCache(RedisCache<String, Object> redisCache) {
+        this.redisCache = redisCache;
+    }
+
+    public void setSysUserService(SysUserService sysUserService) {
+        this.sysUserService = sysUserService;
+    }
+
+    public void setSmsCodeService(IdGeneratorService smsCodeService) {
+        this.smsCodeService = smsCodeService;
+    }
+
+    public void setSysUserDeviceService(SysUserDeviceService sysUserDeviceService) {
+        this.sysUserDeviceService = sysUserDeviceService;
+    }
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveBroadcastRoomMemberDao.java

@@ -60,5 +60,19 @@ public interface ImLiveBroadcastRoomMemberDao extends BaseMapper<ImLiveBroadcast
      * @param roomUid 房间id
      */
     RoomMemberNumDto queryMemberNum(@Param("roomUid") String roomUid);
+
+    /**
+     * 学后报名乐团
+     * @param studentIds 学生编号
+     * @return List<ImLiveBroadcastRoomMemberVo>
+     */
+    List<ImLiveBroadcastRoomMemberVo> selectStudentMusicGroup(@Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * 学生声部
+     * @param studentIds 学生编号
+     * @return List<ImLiveBroadcastRoomMemberVo>
+     */
+    List<ImLiveBroadcastRoomMemberVo> selectStudentSubject(@Param("studentIds") List<Integer> studentIds);
 }
 

+ 23 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java

@@ -1,8 +1,8 @@
 package com.ym.mec.biz.dal.dto;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.enums.EUseScene;
+import com.ym.mec.biz.dal.enums.live.ELiveViewMode;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -67,6 +67,12 @@ public class ImLiveBroadcastRoomDto implements Serializable {
     @ApiModelProperty(value = "服务提供方 rongCloud tencentCloud")
     private String serviceProvider;
 
+    @ApiModelProperty("直播观看模式")
+    private ELiveViewMode viewMode;
+
+    @ApiModelProperty("购物车标题")
+    private String shoppingTitle;
+
     @ApiModel(value = "房间配置")
     public static class RoomConfig implements Serializable {
 
@@ -229,5 +235,21 @@ public class ImLiveBroadcastRoomDto implements Serializable {
     public void setServiceProvider(String serviceProvider) {
         this.serviceProvider = serviceProvider;
     }
+
+    public ELiveViewMode getViewMode() {
+        return viewMode;
+    }
+
+    public void setViewMode(ELiveViewMode viewMode) {
+        this.viewMode = viewMode;
+    }
+
+    public String getShoppingTitle() {
+        return shoppingTitle;
+    }
+
+    public void setShoppingTitle(String shoppingTitle) {
+        this.shoppingTitle = shoppingTitle;
+    }
 }
 

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.enums.EUseScene;
+import com.ym.mec.biz.dal.enums.live.ELiveViewMode;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -114,6 +115,14 @@ public class ImLiveBroadcastRoom implements Serializable {
     @ApiModelProperty(value = "禁言状态: 0 取消;1禁言")
     private Integer banStatus;
 
+    @TableField("view_mode_")
+    @ApiModelProperty("直播观看模式")
+    private ELiveViewMode viewMode;
+
+    @TableField("shopping_title_")
+    @ApiModelProperty("购物车标题")
+    private String shoppingTitle;
+
     @TableField("created_by_")
     @ApiModelProperty(value = "创建人")
     private Integer createdBy;
@@ -358,5 +367,21 @@ public class ImLiveBroadcastRoom implements Serializable {
     public void setLiveTotalTime(Integer liveTotalTime) {
         this.liveTotalTime = liveTotalTime;
     }
+
+    public ELiveViewMode getViewMode() {
+        return viewMode;
+    }
+
+    public void setViewMode(ELiveViewMode viewMode) {
+        this.viewMode = viewMode;
+    }
+
+    public String getShoppingTitle() {
+        return shoppingTitle;
+    }
+
+    public void setShoppingTitle(String shoppingTitle) {
+        this.shoppingTitle = shoppingTitle;
+    }
 }
 

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoomMember.java

@@ -51,6 +51,9 @@ public class ImLiveBroadcastRoomMember implements Serializable {
     @ApiModelProperty(value = "禁言状态:0取消;1禁言")
     private Integer banStatus;
 
+    @TableField("microphone_flag_")
+    @ApiModelProperty(value = "是否能上麦:0否;1是")
+    private Boolean microphoneFlag;
     @TableField("live_room_status_")
     @ApiModelProperty(value = "直播状态: 0离开;1观看")
     private Integer liveRoomStatus;
@@ -60,12 +63,28 @@ public class ImLiveBroadcastRoomMember implements Serializable {
     @ApiModelProperty(value = "连麦状态 0:未申请1:申请连麦中2:连麦中")
     private Integer whetherMicStatus;
 
+    @TableField("fingerprint_")
+    @ApiModelProperty("游客凭据")
+    private String fingerprint;
+
+    @TableField("visitor_name_")
+    @ApiModelProperty("游客名称")
+    private String visitorName;
+
     @TableField("create_time_")
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
     private static final long serialVersionUID = 1L;
 
+    public Boolean getMicrophoneFlag() {
+        return microphoneFlag;
+    }
+
+    public void setMicrophoneFlag(Boolean microphoneFlag) {
+        this.microphoneFlag = microphoneFlag;
+    }
+
     public Integer getWhetherMicStatus() {
         return whetherMicStatus;
     }
@@ -153,5 +172,21 @@ public class ImLiveBroadcastRoomMember implements Serializable {
     public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
+
+    public String getFingerprint() {
+        return fingerprint;
+    }
+
+    public void setFingerprint(String fingerprint) {
+        this.fingerprint = fingerprint;
+    }
+
+    public String getVisitorName() {
+        return visitorName;
+    }
+
+    public void setVisitorName(String visitorName) {
+        this.visitorName = visitorName;
+    }
 }
 

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveRoomBlack.java

@@ -35,6 +35,14 @@ public class ImLiveRoomBlack implements Serializable {
     @ApiModelProperty(value = "-1公共黑名单 0指定直播间黑名单")
     private Integer type;
 
+    @TableField("fingerprint_")
+    @ApiModelProperty("游客凭据")
+    private String fingerprint;
+
+    @TableField("visitor_name_")
+    @ApiModelProperty("游客名称")
+    private String visitorName;
+
     @TableField("create_by_")
     @ApiModelProperty(value = "创建人")
     private Integer createBy;
@@ -93,6 +101,20 @@ public class ImLiveRoomBlack implements Serializable {
         this.createTime = createTime;
     }
 
+    public String getFingerprint() {
+        return fingerprint;
+    }
+
+    public void setFingerprint(String fingerprint) {
+        this.fingerprint = fingerprint;
+    }
+
+    public String getVisitorName() {
+        return visitorName;
+    }
 
+    public void setVisitorName(String visitorName) {
+        this.visitorName = visitorName;
+    }
 }
 

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/live/ELiveViewMode.java

@@ -0,0 +1,32 @@
+package com.ym.mec.biz.dal.enums.live;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.ym.mec.common.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * 直播观看模式
+ */
+@Getter
+public enum ELiveViewMode implements BaseEnum<String, ELiveViewMode> {
+
+    LOGIN("登陆"),
+    VISITOR("游客"),
+    ;
+
+    private final String describe;
+
+    @EnumValue
+    private final String code;
+
+    ELiveViewMode(String describe) {
+        this.describe = describe;
+
+        this.code = this.name();
+    }
+
+    @Override
+    public String getCode() {
+        return code;
+    }
+}

+ 60 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomMemberVo.java

@@ -38,6 +38,9 @@ public class ImLiveBroadcastRoomMemberVo implements java.io.Serializable {
     
     @ApiModelProperty(value = "分部")
     private String organName;
+
+    @ApiModelProperty("机构编号")
+    private Integer organId;
     
     @ApiModelProperty(value = "乐团")
     private String musicGroupName;
@@ -55,10 +58,49 @@ public class ImLiveBroadcastRoomMemberVo implements java.io.Serializable {
     @ApiModelProperty(value = "是否黑名单")
     private boolean blackFlag;
 
+    @ApiModelProperty("游客凭据")
+    private String fingerprint;
+
+    @ApiModelProperty(value = "是否能上麦:false否;true是")
+    private boolean microphoneFlag;
+
+    public boolean isMicrophoneFlag() {
+        return microphoneFlag;
+    }
+
+    public void setMicrophoneFlag(boolean microphoneFlag) {
+        this.microphoneFlag = microphoneFlag;
+    }
+
     public ImLiveBroadcastRoomSimpleMemberVo getSimpleMemberVo(ImLiveBroadcastRoomMemberVo memberVo) {
         return JSON.parseObject(JSON.toJSONString(memberVo), ImLiveBroadcastRoomSimpleMemberVo.class);
     }
 
+    public ImLiveBroadcastRoomMemberVo roomTitle(String roomTitle) {
+        this.roomTitle = roomTitle;
+        return this;
+    }
+
+    public ImLiveBroadcastRoomMemberVo speakerName(String speakerName) {
+        this.speakerName = speakerName;
+        return this;
+    }
+
+    public ImLiveBroadcastRoomMemberVo subName(String subName) {
+        this.subName = subName;
+        return this;
+    }
+
+    public ImLiveBroadcastRoomMemberVo organName(String organName) {
+        this.organName = organName;
+        return this;
+    }
+
+    public ImLiveBroadcastRoomMemberVo musicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+        return this;
+    }
+
     public static class ImLiveBroadcastRoomSimpleMemberVo {
 
         @ApiModelProperty(value = "学生头像")
@@ -226,4 +268,22 @@ public class ImLiveBroadcastRoomMemberVo implements java.io.Serializable {
 	public void setMusicGroupName(String musicGroupName) {
 		this.musicGroupName = musicGroupName;
 	}
+
+    public String getFingerprint() {
+        return fingerprint;
+    }
+
+    public void setFingerprint(String fingerprint) {
+        this.fingerprint = fingerprint;
+    }
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomVo.java

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.microsvc.toolkit.middleware.live.message.LiveRoomConfig;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.enums.EUseScene;
+import com.ym.mec.biz.dal.enums.live.ELiveViewMode;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -127,6 +128,11 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     @ApiModelProperty("视频数量")
     private Integer videoNum;
 
+    @ApiModelProperty("直播观看模式")
+    private ELiveViewMode viewMode;
+
+    @ApiModelProperty("购物车标题")
+    private String shoppingTitle;
 
     @ApiModelProperty("使用场景 正常:NORMAL 音乐:MUSIC")
     private EUseScene useScene;
@@ -434,5 +440,21 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     public void setLiveTotalTime(Integer liveTotalTime) {
         this.liveTotalTime = liveTotalTime;
     }
+
+    public ELiveViewMode getViewMode() {
+        return viewMode;
+    }
+
+    public void setViewMode(ELiveViewMode viewMode) {
+        this.viewMode = viewMode;
+    }
+
+    public String getShoppingTitle() {
+        return shoppingTitle;
+    }
+
+    public void setShoppingTitle(String shoppingTitle) {
+        this.shoppingTitle = shoppingTitle;
+    }
 }
 

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/RoomUserInfoVo.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -24,6 +25,9 @@ public class RoomUserInfoVo extends BaseRoomUserVo implements Serializable  {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date dynamicLookTime;
 
+    @ApiModelProperty("用户头象")
+    private String avatar;
+
     public Integer getTotalViewTime() {
         return totalViewTime;
     }
@@ -56,4 +60,11 @@ public class RoomUserInfoVo extends BaseRoomUserVo implements Serializable  {
         this.tenantId = tenantId;
     }
 
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
 }

+ 42 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.microsvc.toolkit.middleware.live.message.TencentWrapper;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.dto.LiveRoomStatus;
 import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
@@ -12,6 +13,7 @@ import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.dal.vo.RoomReservationUserVo;
 import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
+import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
 import com.ym.mec.common.entity.ImUserState;
 import com.ym.mec.common.page.PageInfo;
 
@@ -32,6 +34,14 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, Integer userId, Integer osType);
 
+    /**
+     * 游客直播间信息
+     * @param roomUid 直播间编号
+     * @param userId 游客编号
+     * @return ImLiveBroadcastRoomVo
+     */
+    ImLiveBroadcastRoomVo visitorRoomInfo(String roomUid, Integer userId);
+
     ImLiveBroadcastRoomVo queryRoomInfo(String roomUid);
 
     void add(ImLiveBroadcastRoomDto dto);
@@ -77,6 +87,38 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void joinRoom(String roomUid, Integer userId);
 
+    void joinRoom(String roomUid, Integer userId, Boolean microphoneFlag);
+
+    /**
+     * 游客加入直播间
+     * @param roomUid 直播间编号
+     * @param userId 游客编号
+     */
+    void visitorJoinRoom(String roomUid, Integer userId);
+
+    /**
+     * 游客加入直播间凭据
+     * @param roomUid 直播间编号
+     * @param fingerprint 游客凭据
+     * @return RoomUserInfoVo
+     */
+    RoomUserInfoVo getVisitorCredentials(String roomUid, String fingerprint);
+
+    /**
+     * 游客微信身份
+     * @param code 授权码
+     * @return 用户openId
+     */
+    String visitorFingerprint(String code);
+
+    /**
+     * 直播间访问用户信息
+     * @param userId 用户编号
+     * @param roomUid 直播间编号
+     * @return SysUser
+     */
+    SysUser getRoomSysUser(Integer userId, String roomUid);
+
     void startLive(String roomUid, Integer userId,String videoResolution);
 
     void startLive(String roomUid, Integer userId, String videoResolution, String sequence);

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -403,6 +403,16 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 
     // 按分部强制开始为腾讯服务提供
     String TENCENT_RTC_SERVICE_PROVIDER = "tencent_rtc_service_provider";
+    
+    // 游客默认头像
+    String VISITOR_DEFAULT_AVATAR = "visitor_default_avatar";
+
+    // 微信公众号appid
+    String WECHAT_APPID = "wechat_appid";
+
+    // 微信公众号secret
+    String WECHAT_SECRET = "wechat_secret";
+
 
     static void checkActivityDate(String startTimeStr, String endTimeStr) {
         if(StringUtils.isEmpty(startTimeStr) || StringUtils.isEmpty(startTimeStr)){

+ 112 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomMemberServiceImpl.java

@@ -1,26 +1,33 @@
 package com.ym.mec.biz.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomMemberDao;
-import com.ym.mec.biz.dal.dto.LiveRoomStatus;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
+import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomDetailVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo;
-import com.ym.mec.biz.service.ImLiveBroadcastRoomDataService;
-import com.ym.mec.biz.service.ImLiveBroadcastRoomMemberService;
-import com.ym.mec.biz.service.ImLiveRoomVideoService;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -29,15 +36,22 @@ import java.util.stream.Collectors;
  * @author hgw
  * @since 2022-02-21 14:26:59
  */
+@Slf4j
 @Service("imLiveBroadcastRoomMemberService")
 public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroadcastRoomMemberDao, ImLiveBroadcastRoomMember> implements ImLiveBroadcastRoomMemberService {
 
-    private final static Logger log = LoggerFactory.getLogger(ImLiveBroadcastRoomMemberServiceImpl.class);
-
     @Autowired
     private ImLiveBroadcastRoomDataService imLiveBroadcastRoomDataService;
     @Autowired
     private ImLiveRoomVideoService imLiveRoomVideoService;
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private OrganizationDao organizationDao;
 
     @Override
     public ImLiveBroadcastRoomMemberDao getDao() {
@@ -58,13 +72,98 @@ public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroa
     @Override
     public PageInfo<ImLiveBroadcastRoomMemberVo> queryRoomMember(Map<String, Object> param) {
         Page<ImLiveBroadcastRoomMemberVo> pageInfo = PageUtil.getPageInfo(param);
-        return PageUtil.pageInfo(baseMapper.queryMemberPage(pageInfo, param));
+
+        IPage<ImLiveBroadcastRoomMemberVo> page = baseMapper.queryMemberPage(pageInfo, param);
+
+        List<ImLiveBroadcastRoomMemberVo> records = page.getRecords();
+
+        if (CollectionUtils.isNotEmpty(records)) {
+
+            // 游客默认头像
+            String defaultAvatar = Optional.ofNullable(sysConfigService.findByParamName(SysConfigService.VISITOR_DEFAULT_AVATAR)
+                            .getParanValue()).orElse("");
+
+            String roomUid = MapUtils.getString(param, "roomUid", RandomStringUtils.random(5));
+            // 直播间信息
+            ImLiveBroadcastRoom room = imLiveBroadcastRoomService.lambdaQuery()
+                    .eq(ImLiveBroadcastRoom::getRoomUid, roomUid)
+                    .last("LIMIT 1")
+                    .one();
+            if (Objects.isNull(room)) {
+                throw new BizException("直播间不存在");
+            }
+            // 直播间主讲老师
+            SysUser speaker = sysUserFeignService.queryUserById(room.getSpeakerId());
+
+            // 机构名称
+            List<Integer> organIds = records.stream()
+                    .map(ImLiveBroadcastRoomMemberVo::getOrganId).distinct().collect(Collectors.toList());
+
+            Map<Integer, String> organMap = organizationDao.findOrgans(organIds).stream()
+                    .collect(Collectors.toMap(Organization::getId, Organization::getName, (o, n) -> n));
+
+            List<Integer> studentIds = records.stream()
+                    .filter(x -> StringUtils.isBlank(x.getFingerprint()))
+                    .map(ImLiveBroadcastRoomMemberVo::getStudentId)
+                    .filter(Objects::nonNull)
+                    .distinct().collect(Collectors.toList());
+
+            // 学生报名乐团
+            Map<Integer, String> musicGroupMap = Maps.newConcurrentMap();
+            // 学生声部名称
+            Map<Integer, String> subjectMap = Maps.newConcurrentMap();
+
+            // 直播客户端查询在线用户信息时,忽略学生相关信息查询
+            if (MapUtils.getIntValue(param, "rows", 10) < 100) {
+
+                for (List<Integer> item : Lists.partition(studentIds, 500)) {
+                    // 并发查询学生信息
+                    Lists.partition(item, 50).parallelStream().forEach(data -> {
+
+                        // 学生报名乐团
+                        Map<Integer, String> musicMap = baseMapper.selectStudentMusicGroup(data).stream()
+                                .filter(x -> Objects.nonNull(x) && Objects.nonNull(x.getStudentId()))
+                                .collect(Collectors.toMap(ImLiveBroadcastRoomMemberVo::getStudentId, x -> Optional.ofNullable(x.getMusicGroupName()).orElse(""), (o, n) -> n));
+
+                        if (MapUtils.isNotEmpty(musicMap)) {
+                            musicGroupMap.putAll(musicMap);
+                        }
+
+                        // 学生声部名称
+                        Map<Integer, String> collect = baseMapper.selectStudentSubject(studentIds).stream()
+                                .filter(x -> Objects.nonNull(x) && Objects.nonNull(x.getStudentId()))
+                                .collect(Collectors.toMap(ImLiveBroadcastRoomMemberVo::getStudentId, x -> Optional.ofNullable(x.getSubName()).orElse(""), (o, n) -> n));
+                        if (MapUtils.isNotEmpty(collect)) {
+                            subjectMap.putAll(collect);
+                        }
+                    });
+                }
+            }
+
+            for (ImLiveBroadcastRoomMemberVo item : records) {
+
+                if (StringUtils.isNotEmpty(item.getFingerprint())) {
+                    // 设置游客默认头像
+                    item.setAvatar(defaultAvatar);
+                } else {
+                    // 设置默认数据
+                    item.subName(subjectMap.getOrDefault(item.getStudentId(), ""))
+                            .organName(organMap.getOrDefault(item.getOrganId(), ""))
+                            .musicGroupName(musicGroupMap.getOrDefault(item.getStudentId(), ""))
+                            .roomTitle(room.getRoomTitle())
+                            .setSpeakerName(speaker.getRealName());
+                }
+
+            }
+        }
+
+        return PageUtil.pageInfo(page);
     }
 
     /**
      * 查询在房间人员
      *
-     * @param roomUid
+     * @param roomUid 直播间编号
      */
     @Override
     public List<Integer> getLiveRoomMember(String roomUid) {

+ 407 - 41
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.json.ali.AliJSONMap;
 import com.microsvc.toolkit.middleware.live.LivePluginContext;
 import com.microsvc.toolkit.middleware.live.LivePluginService;
 import com.microsvc.toolkit.middleware.live.impl.RongCloudLivePlugin;
@@ -39,6 +40,7 @@ import com.ym.mec.biz.dal.enums.EAnchorStatus;
 import com.ym.mec.biz.dal.enums.EGroupDefinedDataType;
 import com.ym.mec.biz.dal.enums.EOnOffStatus;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.live.ELiveViewMode;
 import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.*;
 import com.ym.mec.biz.redisson.RedissonMessageService;
@@ -55,11 +57,15 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
+import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.jetbrains.annotations.NotNull;
 import org.joda.time.DateTime;
+import org.redisson.api.RAtomicLong;
 import org.redisson.api.RBucket;
 import org.redisson.api.RLock;
 import org.redisson.api.RMap;
@@ -145,6 +151,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public static final String LIVE_USER_STATE_TIME = String.join(":", "IM:LIVE_USER_STATE_TIME", USER_ID);
     //主讲人信息
     public static final String LIVE_SPEAKER_INFO = String.join(":", "IM:LIVE_SPEAKER_INFO", ROOM_UID, USER_ID);
+    // 直播间游客信息
+    public static final String LIVE_VISITOR_INFO = String.join(":", "IM:LIVE_VISITOR_INFO", ROOM_UID, USER_ID);
     //主讲人最近一次加入房间的clientIp
     public static final String LIVE_SPEAKER_LAST_CLIENT_IP = String.join(":", "IM:LIVE_SPEAKER_LAST_CLIENT_IP", ROOM_UID, USER_ID);
     //直播提前开始时间
@@ -161,20 +169,25 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     @Override
     public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, Integer userId, Integer osType) {
+
         SysUser sysUser = Optional.ofNullable(userId)
                 .map(this::getSysUser)
                 .orElseGet(this::getSysUser);
+
         // 默认学生端查询
         osType = Optional.ofNullable(osType).orElse(1);
+
+        // 移动端-学生端
         if (osType == 1) {
             //学生端
             return studentQueryRoomAndCheck(roomUid, sysUser);
-        } else if (osType == 2) {
+        }
+        // 移动端-老师端
+        if (osType == 2) {
             //老师端
             return teacherQueryRoomAndCheck(roomUid, sysUser);
         }
-
-        // 直播助手
+        // PC端-直播助手
         if (osType == 3) {
             // 校验直播间是否存在
             ImLiveBroadcastRoomVo vo = Optional.ofNullable(roomUid).map(this::queryRoomInfo)
@@ -188,6 +201,57 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         return queryRoomAndCheck(roomUid, sysUser);
     }
 
+    /**
+     * 游客直播间信息
+     *
+     * @param roomUid 直播间编号
+     * @param userId  游客编号
+     * @return ImLiveBroadcastRoomVo
+     */
+    @Override
+    public ImLiveBroadcastRoomVo visitorRoomInfo(String roomUid, Integer userId) {
+
+        // 直播间游客信息
+        RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
+        if (!roomTotalUser.containsKey(userId)) {
+            throw new BizException("您无法观看该直播,请刷新重试");
+        }
+
+        // 游客信息
+        RoomUserInfoVo userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)),
+                RoomUserInfoVo.class);
+
+        // 游客直播间信息校验
+        ImLiveBroadcastRoomVo roomVo = getVisitorLiveBroadcastRoomVo(roomUid);
+
+        // 用户直播间黑名单
+        roomVo.setBlacklistFlag(0);
+        //黑名单查询-查询当前用户是否在黑名单中
+        int count = imLiveRoomBlackService.count(Wrappers.<ImLiveRoomBlack>lambdaQuery()
+                .eq(ImLiveRoomBlack::getRoomUid, roomVo.getRoomUid())
+                .eq(ImLiveRoomBlack::getUserId, userInfo.getUserId()));
+        if (count > 0) {
+            roomVo.setBlacklistFlag(1);
+        }
+
+        LivePluginService pluginService = livePluginContext.getPluginService(roomVo.getServiceProvider());
+        // 直播房间配置信息
+        String userSig = "";
+        try {
+            // 生成聊天签名
+            userSig = pluginService.register(userInfo.getUserId().toString(), userInfo.getUserName(), userInfo.getAvatar());
+
+        } catch (Exception e) {
+            log.error("直播房间游客注册失败: userId={}", userInfo.getUserId(), e);
+        }
+
+        // 直播房间统计信息
+        getRoomData(roomVo);
+
+        // 直播间配置信息
+        return roomVo.userSig(userSig).liveRoomConfig(pluginService.getLiveRoomConfig());
+    }
+
     public ImLiveBroadcastRoomVo studentQueryRoomAndCheck(String roomUid, SysUser sysUser) {
         //如果是学生端,则需要检查是否有权限进入
         Map<String, Object> param = new HashMap<>();
@@ -1004,7 +1068,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         userid = setFromUserId(userid,roomVo);
         // 消息发送用户
         LiveRoomMessage.MessageUser messageUser = null;
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        SysUser sysUser = getRoomSysUser(Integer.parseInt(userid), roomVo.getRoomUid());
         if (Objects.nonNull(sysUser)) {
             // 发送用户信息
             messageUser = LiveRoomMessage.MessageUser
@@ -1059,7 +1123,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         String fromUserId = setFromUserId(userid, roomVo);
         // 消息发送用户
         LiveRoomMessage.MessageUser messageUser = null;
-        SysUser sysUser = sysUserFeignService.queryUserById(Integer.parseInt(userid));
+        SysUser sysUser = getRoomSysUser(Integer.parseInt(userid), roomVo.getRoomUid());
         if (Objects.nonNull(sysUser)) {
             // 发送用户信息
             messageUser = LiveRoomMessage.MessageUser
@@ -1118,7 +1182,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         // 直播间统计数据
         getRoomData(roomVo);
 
-        String userId = setFromUserId(fromUserId.toString(),roomVo);
+        String userId = setFromUserId(fromUserId.toString(), roomVo);
         // 缓存JoinRoom用户信息到redis
         RBucket<Object> bucket = redissonClient.getBucket(RedissonMessageService.LIVE_ROOM_MEMBER + roomUid);
         if (!bucket.isExists()) {
@@ -1129,7 +1193,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 
         // 消息发送用户
         LiveRoomMessage.MessageUser messageUser = null;
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        SysUser sysUser = getRoomSysUser(fromUserId, roomUid);
         if (Objects.nonNull(sysUser)) {
             // 发送用户信息
             messageUser = LiveRoomMessage.MessageUser
@@ -1365,6 +1429,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * @param userId  用户id
      */
     public void joinRoom(String roomUid, Integer userId) {
+        joinRoom(roomUid, userId, true);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void joinRoom(String roomUid, Integer userId,Boolean microphoneFlag) {
         //查询房间信息
         ImLiveBroadcastRoomVo imLiveBroadcastRoomVo = getImLiveBroadcastRoomVo(roomUid);
         if (Objects.isNull(imLiveBroadcastRoomVo)) {
@@ -1383,13 +1453,29 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             throw new BizException("当前用户所在机构没有加入直播间的权限");
         }
 
+        // 加入直播间用户信息
+        joinRoomUserInfo(roomUid, userId, imLiveBroadcastRoomVo,microphoneFlag);
+    }
+
+    /**
+     * 加入直播间用户信息
+     * @param roomUid 直播间编号
+     * @param userId 用户编号
+     * @param imLiveBroadcastRoomVo ImLiveBroadcastRoomVo
+     */
+    private void joinRoomUserInfo(String roomUid, Integer userId, ImLiveBroadcastRoomVo imLiveBroadcastRoomVo) {
+        joinRoomUserInfo(roomUid, userId, imLiveBroadcastRoomVo,true);
+    }
+    private void joinRoomUserInfo(String roomUid, Integer userId, ImLiveBroadcastRoomVo imLiveBroadcastRoomVo,Boolean microphoneFlag) {
+
         //记录用户当前房间uid
         redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 12L, TimeUnit.HOURS);
-        //房间累计用户信息-指只要进入到该房间的用户都要记录
-        RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
+
         //判断是否第一次进房间
         RoomUserInfoVo userInfo;
-        Date now = new Date();
+
+        //房间累计用户信息-指只要进入到该房间的用户都要记录
+        RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
         if (roomTotalUser.containsKey(userId)) {
             //多次进入更新动态进入时间
             userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class);
@@ -1403,30 +1489,34 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             if (Objects.isNull(liveRoomMember)) {
 
                 // 初次进入房间
-                getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo, now);
+                getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo, microphoneFlag);
             } else {
                 // 更新直播间用户信息
                 ImLiveBroadcastRoomMember roomMember = new ImLiveBroadcastRoomMember();
                 roomMember.setId(liveRoomMember.getId());
                 roomMember.setOnlineStatus(1);
                 roomMember.setLiveRoomStatus(1);
+                roomMember.setMicrophoneFlag(microphoneFlag);
 
                 liveBroadcastRoomMemberService.updateById(roomMember);
             }
 
         } else {
             //第一次进该房间 写入用户首次进入时间
-            userInfo = getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo, now);
+            userInfo = getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo, microphoneFlag);
         }
+
         //查询主讲人信息
         RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, imLiveBroadcastRoomVo.getSpeakerId().toString());
         if (speakerCache.isExists()) {
             //如果用户进来时主讲人已经开启直播则修改学生观看时间
             Integer state = speakerCache.get().getState();
             if (Objects.nonNull(state) && state == 0 && imLiveBroadcastRoomVo.getPushStatus() == 1) {
-                userInfo.setDynamicLookTime(now);
+                userInfo.setDynamicLookTime(DateTime.now().toDate());
             }
         }
+
+        // 直播间用户、在线用户数据缓存
         roomTotalUser.fastPut(userId, JSONObject.toJSONString(userInfo));
         //在线人员列表
         RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid);
@@ -1441,12 +1531,234 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             this.sendBlackJoinRoom(userId, imLiveBroadcastRoomVo);
         }
 
-
-        log.info("join sendOnlineUserCount>>>>   roomUid: {}  fromUserId:{}  count:{}", roomUid, userId, onlineUserInfo.size());
+        log.info("joinRoom>>>> sendOnlineUserCount>>>>   roomUid: {}  fromUserId:{}  count:{}", roomUid, userId, onlineUserInfo.size());
         log.info("joinRoom>>>> userInfo: {}", JSONObject.toJSONString(userInfo));
     }
 
     /**
+     * 游客加入直播间
+     *
+     * @param roomUid 直播间编号
+     * @param userId  游客编号
+     */
+    @Override
+    public void visitorJoinRoom(String roomUid, Integer userId) {
+
+        // 游客直播间信息
+        ImLiveBroadcastRoomVo roomVo = getVisitorLiveBroadcastRoomVo(roomUid);
+
+        // 加入直播间用户信息
+        joinRoomUserInfo(roomUid, userId, roomVo,false);
+    }
+
+    /**
+     * 游客访问直播间信息
+     *
+     * @param roomUid 直播间编号
+     */
+    private ImLiveBroadcastRoomVo getVisitorLiveBroadcastRoomVo(String roomUid) {
+        // 查询直播间信息
+        ImLiveBroadcastRoomVo roomVo = getImLiveBroadcastRoomVo(roomUid);
+        if (Objects.isNull(roomVo) || roomVo.getRoomState() == 1) {
+            log.info("visitorJoinRoom>>>> joinRoom LIVE_ROOM_CANCEL roomUid: {}", roomUid);
+            throw new BizException("直播间不存在");
+        }
+
+        // 判断当前直播间观看模式是否为游客模式且,直播状态
+        if (ELiveViewMode.VISITOR != roomVo.getViewMode()) {
+            log.info("visitorJoinRoom>>>> joinRoom LOGOUT roomUid: {} viewMode: {}", roomUid, roomVo.getViewMode());
+            throw new BizException("请登陆");
+        }
+
+        // 判断当前直播间是否在直播中,直播状态 0未开始 1开始 2结束
+        if (roomVo.getLiveState() == 0) {
+            log.info("visitorJoinRoom>>>> joinRoom LIVE_NOT_START roomUid: {} liveState: {}", roomUid, roomVo.getLiveState());
+
+            Date liveStartTime = DateUtil.addMinutes(roomVo.getLiveStartTime(), -PRE_LIVE_TIME_MINUTE);
+            throw new BizException(DateUtil.format(liveStartTime, "yyyy年MM月dd日 HH点mm分") + " 可进入直播间准备");
+        }
+        if (roomVo.getLiveState() == 2) {
+            log.info("visitorJoinRoom>>>> joinRoom LIVE_CLOSED roomUid: {} liveState: {}", roomUid, roomVo.getLiveState());
+
+            //如果直播结束了还是推广状态则将推广修改为取消
+            if (roomVo.getPopularize() == 1) {
+                this.update(Wrappers.<ImLiveBroadcastRoom>lambdaUpdate()
+                        .set(ImLiveBroadcastRoom::getPopularize, 0)
+                        .eq(ImLiveBroadcastRoom::getId, roomVo.getId()));
+            }
+
+            throw new BizException("直播已结束!");
+        }
+
+        return roomVo;
+    }
+
+    /**
+     * 游客加入直播间凭据
+     *
+     * @param roomUid     直播间编号
+     * @param fingerprint 游客凭据
+     * @return RoomUserInfoVo
+     */
+    @Override
+    public RoomUserInfoVo getVisitorCredentials(String roomUid, String fingerprint) {
+
+        // 游客直播间信息校验
+        ImLiveBroadcastRoomVo roomVo = getVisitorLiveBroadcastRoomVo(roomUid);
+
+        String today = DateTime.now().toString("yyyyMMdd");
+        // 为当前游客生成惟一用户ID
+        String cacheKey = MessageFormat.format("fingerprint:{0}:{1}", today, fingerprint);
+        RBucket<Object> bucket = redissonClient.getBucket(cacheKey);
+
+        Integer userId;
+        if (bucket.isExists()) {
+
+            // 查询游客用户ID
+            userId = Optional.ofNullable(bucket.get()).map(x -> (int) x).orElse(-1);
+        } else {
+
+            // 用户Id缓存key
+            String userIdKey = MessageFormat.format("fingerprint:userId:{0}", today);
+
+            RAtomicLong atomicLong = redissonClient.getAtomicLong(userIdKey);
+            if (!atomicLong.isExists()) {
+                // 设置默认初始化值
+                atomicLong.set(1000);
+                // 设置缓存失效时间
+                atomicLong.expire(1L, TimeUnit.DAYS);
+            }
+
+            // 生成游客用户ID
+            userId = (int) atomicLong.getAndIncrement();
+            // 设置用户ID缓存
+            bucket.set(userId, 12L, TimeUnit.HOURS);
+        }
+
+        //房间累计用户信息-指只要进入到该房间的用户都要记录
+        RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
+
+        RoomUserInfoVo userInfo;
+        if (roomTotalUser.containsKey(userId)) {
+            //多次进入更新动态进入时间
+            userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class);
+
+            Integer exists = liveBroadcastRoomMemberService.lambdaQuery()
+                    .eq(ImLiveBroadcastRoomMember::getTenantId, userInfo.getTenantId())
+                    .eq(ImLiveBroadcastRoomMember::getRoomUid, roomUid)
+                    .eq(ImLiveBroadcastRoomMember::getUserId, userInfo.getUserId())
+                    .count();
+
+            if (exists <= 0) {
+                // 初次进入房间
+                getLiveRoomVisitorInfo(userId, roomVo, fingerprint);
+            }
+
+        } else {
+            //第一次进该房间 写入用户首次进入时间
+            userInfo = getLiveRoomVisitorInfo(userId, roomVo, fingerprint);
+        }
+
+        // 缓存用户信息
+        roomTotalUser.fastPut(userId, JSONObject.toJSONString(userInfo));
+
+        // 游客缓存信息
+        getRoomVisitorInfoCache(roomUid, userId.toString()).set(userInfo, 12L, TimeUnit.HOURS);
+
+        // 返回直播间访客信息
+        return userInfo;
+    }
+
+    /**
+     * 游客微信身份
+     *
+     * @param code 授权码
+     * @return 用户openId
+     */
+    @Override
+    public String visitorFingerprint(String code) {
+
+        // 微信公众号appId
+        String appId = sysConfigDao.findConfigValue(SysConfigService.WECHAT_APPID);
+        // 微信公众号secret
+        String secret = sysConfigDao.findConfigValue(SysConfigService.WECHAT_SECRET);
+
+        if (StringUtils.isAnyBlank(appId, secret, code)) {
+            // 若微信未配置,产生64位随机数
+            return RandomStringUtils.random(64);
+        }
+
+        try {
+            // 获取用户OpenId接口
+            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code";
+
+            // 封装请求参数
+            url = MessageFormat.format(url, appId, secret, code);
+
+            String wxMpOAuth2AccessTokenUrl = HttpUtil.get(url, null);
+            log.info("请求微信授权接口的参数:{}", wxMpOAuth2AccessTokenUrl);
+            if (StringUtils.isEmpty(wxMpOAuth2AccessTokenUrl)) {
+                throw new BizException(999,"授权失败,请重新授权");
+            }
+            Map<String, Object> weChatRes = AliJSONMap.tomap(wxMpOAuth2AccessTokenUrl);
+
+            if (!weChatRes.containsKey("openid")) {
+                log.error("获取微信openId失败:[{}]", JSON.toJSONString(weChatRes));
+
+                throw new BizException(999,"授权失败,请重新授权");
+            }
+
+            return MapUtils.getString(weChatRes, "openid", "");
+
+        } catch (Exception e) {
+            log.error("获取微信openId失败:[{}]", e.getMessage(), e);
+
+            throw new BizException(999,"授权失败,请重新授权");
+        }
+
+    }
+
+    /**
+     * 获取直播间游客信息
+     * @param userId 游客编号
+     * @param imLiveBroadcastRoomVo ImLiveBroadcastRoomVo
+     * @param fingerprint 游客凭据
+     * @return RoomUserInfoVo
+     */
+    private RoomUserInfoVo getLiveRoomVisitorInfo(Integer userId, ImLiveBroadcastRoomVo imLiveBroadcastRoomVo, String fingerprint) {
+
+        RoomUserInfoVo userInfo = new RoomUserInfoVo();
+        // 生成游客账号信息,缓存信息
+        userInfo.setTenantId(-1);
+        userInfo.setUserId(userId);
+        userInfo.setUserName(MessageFormat.format("游客{0}", String.valueOf(userId)));
+        userInfo.setTotalViewTime(0);
+        userInfo.setFirstJoinTime(DateTime.now().toDate());
+
+        // 游客默认头像
+        String defaultAvatar = sysConfigDao.findByParamName(SysConfigService.VISITOR_DEFAULT_AVATAR).getParanValue();
+        userInfo.setAvatar(Optional.ofNullable(defaultAvatar).orElse(""));
+
+        // 记录直播间用户信息
+        ImLiveBroadcastRoomMember roomMember = new ImLiveBroadcastRoomMember();
+        roomMember.setTenantId(userInfo.getTenantId());
+        roomMember.setRoomUid(imLiveBroadcastRoomVo.getRoomUid());
+        roomMember.setUserId(userInfo.getUserId());
+        roomMember.setJoinTime(DateTime.now().toDate());
+        roomMember.setTotalTime(0);
+        roomMember.setOnlineStatus(1);
+        roomMember.setBanStatus(0);
+        roomMember.setLiveRoomStatus(1);
+        roomMember.setFingerprint(fingerprint);
+        roomMember.setVisitorName(userInfo.getUserName());
+
+        // 保存直播间用户信息
+        liveBroadcastRoomMemberService.save(roomMember);
+
+        return userInfo;
+    }
+
+    /**
      * 发送黑名单进入消息
      * @param userId 用户id
      */
@@ -1462,18 +1774,21 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         String fromUserid = setFromUserId(userId.toString(),roomVo);
         // 消息发送用户
         LiveRoomMessage.MessageUser messageUser = null;
-        SysUser sysUser = sysUserFeignService.queryUserById(userId);
+
+        // 直播间访问用户信息
+        SysUser sysUser = getRoomSysUser(userId, roomUid);
         if (Objects.nonNull(sysUser)) {
             // 发送用户信息
             messageUser = LiveRoomMessage.MessageUser
-                .builder()
-                .sendUserId(sysUser.getId().toString())
-                .sendUserName(sysUser.getUsername())
-                .avatarUrl(sysUser.getAvatar())
-                .blackFlag(true)
-                .build();
+                    .builder()
+                    .sendUserId(sysUser.getId().toString())
+                    .sendUserName(sysUser.getUsername())
+                    .avatarUrl(sysUser.getAvatar())
+                    .blackFlag(true)
+                    .build();
         }
 
+
         LiveRoomMessage.MessageContent messageContent = LiveRoomMessage.MessageContent
             .builder()
             .sendUserInfo(messageUser)
@@ -1492,23 +1807,58 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             livePluginContext.getPluginService(roomVo.getServiceProvider()).sendChatRoomMessage(message);
             log.info("sendBlackJoinRoom>>>> message: {}", JSONObject.toJSONString(message));
         } catch (Exception e) {
-            log.error("sendBlackJoinRoom>>>> error {}", e.getMessage());
             log.error("sendBlackJoinRoom>>>> sendMessage {} :", JSONObject.toJSONString(message));
+            log.error("sendBlackJoinRoom>>>> error", e);
+        }
+    }
+
+    /**
+     * 直播间访问用户信息
+     * @param userId 用户编号
+     * @param roomUid 直播间编号
+     * @return SysUser
+     */
+    @Override
+    public SysUser getRoomSysUser(Integer userId, String roomUid) {
+
+        SysUser sysUser = null;
+        // 直播间游客或学生用户匹配
+        RBucket<RoomUserInfoVo> visitorInfoCache = getRoomVisitorInfoCache(roomUid, userId.toString());
+        if (getRoomVisitorInfoCache(roomUid, userId.toString()).isExists()) {
+
+            // 游客身份信息
+            RoomUserInfoVo userInfoVo = visitorInfoCache.get();
+            if (Objects.nonNull(userInfoVo)) {
+                sysUser = new SysUser();
+                sysUser.setId(userInfoVo.getUserId());
+                sysUser.setUsername(userInfoVo.getUserName());
+                sysUser.setAvatar(userInfoVo.getAvatar());
+            }
+
+        } else {
+
+            // 登录用户信息
+            sysUser = sysUserFeignService.queryUserById(userId);
         }
+
+        return sysUser;
     }
 
     /**
      * 获取直播间用户信息
      * @param userId 用户id
      * @param imLiveBroadcastRoomVo 直播间信息
-     * @param now 当前时间
      * @return RoomUserInfoVo
      */
     @NotNull
-    private RoomUserInfoVo getLiveRoomUserInfo(Integer userId, ImLiveBroadcastRoomVo imLiveBroadcastRoomVo, Date now) {
+    private RoomUserInfoVo getLiveRoomUserInfo(Integer userId, ImLiveBroadcastRoomVo imLiveBroadcastRoomVo) {
+        return getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo,true);
+
+    }
+    private RoomUserInfoVo getLiveRoomUserInfo(Integer userId, ImLiveBroadcastRoomVo imLiveBroadcastRoomVo,Boolean microphoneFlag) {
 
         RoomUserInfoVo userInfo = getUserInfo(userId);
-        userInfo.setFirstJoinTime(now);
+        userInfo.setFirstJoinTime(DateTime.now().toDate());
         userInfo.setTotalViewTime(0);
 
         // 记录直播间用户信息
@@ -1521,6 +1871,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         roomMember.setOnlineStatus(1);
         roomMember.setBanStatus(0);
         roomMember.setLiveRoomStatus(1);
+        roomMember.setMicrophoneFlag(microphoneFlag);
 
         // 保存直播间用户信息
         liveBroadcastRoomMemberService.save(roomMember);
@@ -1785,6 +2136,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * 定时任务,每分钟执行
      * 提前30分钟主动去融云注册并创建房间
      */
+    @Transactional
     public void createLiveRoom() {
         log.info("createLiveRoom>>>>");
         RBucket<Object> createLock = redissonClient.getBucket("IM:LIVE_ROOM_CREATE_LOCK");
@@ -1891,6 +2243,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                                                    .build();
 
                     // 生成录制任务
+                    log.info("createLiveRoom>>>>>> recordStart:{}", recordStart.jsonString());
                     pluginService.rtcRoomRecordStart(recordStart);
                 }
 
@@ -1922,7 +2275,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             }
 
         } catch (Exception e) {
-            log.error(">>>>>>>>>> createLiveRoom error roomUid:{} msg:{}", room.getRoomUid(), e.getMessage());
+            log.error(">>>>>>>>>> createLiveRoom error roomUid:{}", room.getRoomUid(), e);
             throw new BizException(e.getMessage());
         }
     }
@@ -2087,18 +2440,20 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
     }
 
+    /**
+     * 直播间统计数据
+     * 观看数、点赞数,在线人数
+     * @param roomVo ImLiveBroadcastRoomVo
+     */
     private void getRoomData(ImLiveBroadcastRoomVo roomVo) {
-        //点赞数
-        Object like = redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomVo.getRoomUid())).get();
-        if (Objects.isNull(like)) {
-            like = 0;
-        }
 
-        like = syncLikeCount(roomVo.getRoomUid());
+        // 同步点赞数
+        int likeNums = syncLikeCount(roomVo.getRoomUid());
 
-        roomVo.setLikeNum((int) like);
+        roomVo.setLikeNum(likeNums);
         roomVo.setTotalLookNum(0);
         roomVo.setLookNum(0);
+
         //累计总用户数量
         // roomVo.setTotalLookNum(getNum.apply(this::getTotalUserCache, roomVo.getRoomUid()));
         // //在房间观看用户数量
@@ -2606,24 +2961,24 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * 同步直播间点赞数
      *
      * @param roomUid 直播间uid
-     * @return
+     * @return int
      */
     @Override
-    @Transactional
     public int syncLikeCount(String roomUid) {
+
+        // 直播间信息
         ImLiveBroadcastRoomVo room = getImLiveBroadcastRoomVo(roomUid);
         if (room == null) {
             return 0;
         }
 
+        // 融云直播间
         if (room.getServiceProvider().equals(RongCloudLivePlugin.PLUGIN_NAME)) {
             //点赞数
-            Object like = redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).get();
-            if (Objects.isNull(like)) {
-                like = 0;
-            }
-            return (int) like;
+            return (int) Optional.ofNullable(redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).get()).orElse(0);
         }
+
+        // 腾讯云直播
         LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
         List<TencentWrapper.ChatRoomGroupCounter> chatRoomGroupCounters = null;
         try {
@@ -2648,6 +3003,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                                                                       .eq(ImLiveBroadcastRoomData::getRoomUid, roomUid)
                                                                       .last("limit 1")
                                                                       .one();
+            // 同步点赞数
             if (one != null) {
                 ImLiveBroadcastRoomData imLiveBroadcastRoomData = new ImLiveBroadcastRoomData();
                 imLiveBroadcastRoomData.setId(one.getId());
@@ -2735,6 +3091,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         return redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId).replace(ROOM_UID, roomUid));
     }
 
+    /**
+     * 直播间游客信息
+     * @param roomUid 直播间编号
+     * @param userId 游客编号
+     * @return RBucket<RoomUserInfoVo>
+     */
+    private RBucket<RoomUserInfoVo> getRoomVisitorInfoCache(String roomUid, String userId) {
+        return redissonClient.getBucket(LIVE_VISITOR_INFO.replace(USER_ID, userId).replace(ROOM_UID, roomUid));
+    }
+
     private RoomUserInfoVo getUserInfo(Integer userId) {
         RoomUserInfoVo userInfo = new RoomUserInfoVo();
         userInfo.setUserId(userId);

+ 19 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomBlackServiceImpl.java

@@ -11,9 +11,11 @@ import com.microsvc.toolkit.middleware.live.message.LiveRoomMessage;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImLiveRoomBlackDao;
+import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
 import com.ym.mec.biz.dal.entity.ImLiveRoomBlack;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.dal.vo.ImLiveRoomBlackVo;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomMemberService;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.biz.service.ImLiveRoomBlackService;
 import com.ym.mec.common.entity.ImRoomMessage;
@@ -47,6 +49,8 @@ public class ImLiveRoomBlackServiceImpl extends ServiceImpl<ImLiveRoomBlackDao,
     private LivePluginContext livePluginContext;
     @Autowired
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+    @Autowired
+    private ImLiveBroadcastRoomMemberService imLiveBroadcastRoomMemberService;
 
     /**
      * 查询当前机构学生 -下拉框
@@ -94,6 +98,18 @@ public class ImLiveRoomBlackServiceImpl extends ServiceImpl<ImLiveRoomBlackDao,
             imLiveRoomBlack.setType(0);
             imLiveRoomBlack.setCreateBy(getSysUser().getId());
             imLiveRoomBlack.setCreateTime(new Date());
+
+            // 直播间访问游客信息
+            ImLiveBroadcastRoomMember roomMember = imLiveBroadcastRoomMemberService.lambdaQuery()
+                    .eq(ImLiveBroadcastRoomMember::getRoomUid, roomUid)
+                    .eq(ImLiveBroadcastRoomMember::getUserId, userId)
+                    .last("LIMIT 1")
+                    .one();
+            if (Objects.nonNull(roomMember)) {
+                imLiveRoomBlack.setFingerprint(roomMember.getFingerprint());
+                imLiveRoomBlack.setVisitorName(roomMember.getVisitorName());
+            }
+
             this.save(imLiveRoomBlack);
             ImLiveBroadcastRoomVo roomVo = imLiveBroadcastRoomService.queryRoomInfo(roomUid);
             if (roomVo == null) {
@@ -103,7 +119,7 @@ public class ImLiveRoomBlackServiceImpl extends ServiceImpl<ImLiveRoomBlackDao,
                 log.info("直播房间未开播,不需要发送消息");
                 return;
             }
-            setBlack( userId, roomVo);
+            setBlack(userId, roomVo);
         });
     }
 
@@ -115,7 +131,7 @@ public class ImLiveRoomBlackServiceImpl extends ServiceImpl<ImLiveRoomBlackDao,
         LivePluginService pluginService = livePluginContext.getPluginService(roomVo.getServiceProvider());
         try {
 
-            SysUser sysUser = sysUserFeignService.queryUserById(userId);
+            SysUser sysUser = imLiveBroadcastRoomService.getRoomSysUser(userId, roomVo.getRoomUid());
             if (sysUser == null) {
                 log.error("用户不存在");
                 return;
@@ -192,6 +208,7 @@ public class ImLiveRoomBlackServiceImpl extends ServiceImpl<ImLiveRoomBlackDao,
         message.setIsIncludeSender(1);
         message.setObjectName(type);
         message.setToChatRoomId(roomUid);
+
         HashMap<String, Integer> sendMap = new HashMap<>();
         sendMap.put("userId", userId);
         message.setFromUserId(fromUserId.toString());

+ 2 - 0
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml

@@ -65,6 +65,8 @@
         a.ban_status_ AS banStatus,
         a.created_time_ AS createdTime,
         a.service_provider_ as serviceProvider,
+        a.view_mode_ AS viewMode,
+        a.shopping_title_ AS shoppingTitle,
         a.use_scene_ as useScene
         from im_live_broadcast_room as a
         left join tenant_info AS t on a.tenant_id_ = t.id_

+ 49 - 24
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMemberMapper.xml

@@ -25,34 +25,28 @@
     </insert>
 
     <select id="queryMemberPage" resultType="com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo">
-        select i.room_uid_ as roomUid,
-        i.room_title_ as roomTitle,
-        tu.real_name_ speakerName,
-        a.user_id_ as studentId,
-        a.whether_mic_status_ as whetherMicStatus,
-        su.username_ as studentName,
-        su.avatar_ as avatar,
-        su.phone_ as phone,
-        b.name_ as subName,
-        o.name_ organName,
-        GROUP_CONCAT(distinct mg.name_) musicGroupName,
-        a.join_time_ as joinTime,
-        a.total_time_ as totalViewTime,
-        if(ib.user_id_ is null, 0, 1) as blackFlag
-        from im_live_broadcast_room_member as a
-        left join im_live_broadcast_room as i on a.room_uid_ = i.room_uid_
-        left join sys_user as su on su.id_ = a.user_id_
-        left join student st on su.id_ = st.user_id_
-		LEFT JOIN student_registration sr ON sr.user_id_ = a.user_id_
-		LEFT JOIN music_group mg ON  mg.id_ = sr.music_group_id_
-        left join subject as b on st.subject_id_list_ = b.id_
-		left join `sys_user` tu on tu.`id_` = i.`speaker_id_` 
-		LEFT JOIN `organization` o on o.`id_` = su.`organ_id_`
-        left join im_live_room_black ib on ib.room_uid_ = a.room_uid_ and ib.user_id_ = a.user_id_
+        select
+            a.room_uid_ as roomUid,
+            a.user_id_ as studentId,
+            a.whether_mic_status_ as whetherMicStatus,
+            a.fingerprint_ as fingerprint,
+            IFNULL(su.username_, a.visitor_name_) as studentName,
+            su.avatar_ as avatar,
+            su.phone_ as phone,
+            su.organ_id_ AS organId,
+            a.join_time_ as joinTime,
+            a.total_time_ as totalViewTime,
+            if(ib.user_id_ is null, 0, 1) as blackFlag,
+            a.microphone_flag_ as microphoneFlag
+        from
+            im_live_broadcast_room_member as a
+            left join sys_user as su on su.id_ = a.user_id_
+            left join im_live_room_black ib on ib.room_uid_ = a.room_uid_ and ib.user_id_ = a.user_id_
         where a.room_uid_ = #{param.roomUid}
         <if test="param.search != null ">
             AND (
             a.user_id_ LIKE CONCAT('%', #{param.search},'%')
+            OR a.visitor_name_ LIKE CONCAT('%', #{param.search},'%')
             OR su.username_ LIKE CONCAT('%', #{param.search},'%')
             )
         </if>
@@ -62,6 +56,17 @@
         <if test="param.whetherMicStatus != null">
             and a.whether_mic_status_ = #{param.whetherMicStatus}
         </if>
+        <if test="param.excludeBlacklist != null and param.excludeBlacklist == 1">
+            AND ib.user_id_ is null
+        </if>
+        <if test="param.visitorQuery != null">
+            <if test="param.visitorQuery == 1">
+                AND a.fingerprint_ IS NOT NULL
+            </if>
+            <if test="param.visitorQuery == 0">
+                AND a.fingerprint_ IS NULL
+            </if>
+        </if>
         group by a.user_id_
         ORDER BY a.join_time_
     </select>
@@ -99,4 +104,24 @@
         where room_uid_ = #{roomUid}
         group by room_uid_
     </select>
+
+    <!--学后报名乐团-->
+    <select id="selectStudentMusicGroup" resultType="com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo">
+        select
+            sr.user_id_ as studentId, GROUP_CONCAT(distinct mg.name_) musicGroupName
+        from
+            student_registration sr LEFT JOIN music_group mg ON  mg.id_ = sr.music_group_id_
+        WHERE sr.user_id_ IN (<foreach collection="studentIds" separator="," item="item">#{item}</foreach>)
+    </select>
+    <!--学后报名乐团-->
+
+    <!--学生声部信息-->
+    <select id="selectStudentSubject" resultType="com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo">
+        SELECT
+            st.user_id_ as studentId, b.name_ as subName
+        FROM
+            student st left join subject as b on st.subject_id_list_ = b.id_
+        WHERE st.user_id_ IN (<foreach collection="studentIds" separator="," item="item">#{item}</foreach>)
+    </select>
+    <!--学生声部信息-->
 </mapper>

+ 3 - 2
mec-biz/src/main/resources/config/mybatis/ImLiveRoomBlackMapper.xml

@@ -49,8 +49,8 @@
 
     <select id="queryBlackList"  parameterType="map" resultType="com.ym.mec.biz.dal.vo.ImLiveRoomBlackVo">
         select a.user_id_,
-               b.username_,
-               b.real_name_,
+               IFNULL(b.username_, a.visitor_name_) AS username,
+               IFNULL(b.real_name_, a.visitor_name_) AS realName,
                b.phone_,
                a.create_time_
         from im_live_room_black as a
@@ -60,6 +60,7 @@
         <if test="param.search != null ">
             and (
             a.`user_id_` LIKE CONCAT('%', #{param.search},'%')
+            OR a.`visitor_name_` LIKE CONCAT('%', #{param.search},'%')
             OR b.`username_` LIKE CONCAT('%', #{param.search},'%')
             OR b.`phone_` LIKE CONCAT('%', #{param.search},'%')
             )

+ 2 - 0
mec-biz/src/main/resources/config/mybatis/ImLiveRoomReservationMapper.xml

@@ -46,6 +46,8 @@
         a.created_time_ AS createdTime,
         a.service_provider_ as serviceProvider,
         a.popularize_type_ AS popularizeType,
+        a.view_mode_ AS viewMode,
+        a.shopping_title_ AS shoppingTitle,
         IF(d.user_id_ is null, 0, 1) as reserve
         from (
         select *

+ 1 - 2
mec-biz/src/main/resources/config/mybatis/SysUserCashAccountMapper.xml

@@ -41,8 +41,7 @@
     </select>
 
     <!-- 向数据库增加一条记录 -->
-    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccount" useGeneratedKeys="true"
-            keyColumn="id" keyProperty="id">
+    <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysUserCashAccount" useGeneratedKeys="true">
         INSERT INTO sys_user_cash_account
             (user_id_, currency_, create_time_, update_time, tenant_id_)
         VALUES (#{userId}, #{currency}, now(), now(), #{tenantId})

+ 1 - 1
mec-common/common-core/pom.xml

@@ -64,7 +64,7 @@
 		<dependency>
 			<groupId>org.springframework.security.oauth</groupId>
 			<artifactId>spring-security-oauth2</artifactId>
-			<version>2.2.1.RELEASE</version>
+			<version>2.3.3.RELEASE</version>
 		</dependency>
 
 		<dependency>

+ 100 - 83
mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java

@@ -32,75 +32,92 @@ import java.util.stream.Collectors;
 @ControllerAdvice
 public class BaseController {
 
-	private final static Logger logger = LoggerFactory.getLogger(BaseController.class);
-
-	public static <T> HttpResponseResult<T> succeed(T object) {
-		return getResponseData(true, HttpStatus.OK, object, "");
-	}
-
-	public static <T> HttpResponseResult<T> succeed() {
-		return getResponseData(true, HttpStatus.OK, null, "");
-	}
-
-	public static <T> HttpResponseResult<T> succeedData(T obj) {
-		return getResponseData(true, HttpStatus.OK, obj, "操作成功");
-	}
-
-	public static <T> HttpResponseResult<T> warned(String message) {
-		return failed(HttpStatus.MULTI_STATUS, message);
-	}
-
-	public static <T> HttpResponseResult<T> failed() {
-		return failed("");
-	}
-
-	public static <T> HttpResponseResult<T> failed(String msg) {
-		return failed(HttpStatus.INTERNAL_SERVER_ERROR, msg);
-	}
-
-	public static <T> HttpResponseResult<T> failed(HttpStatus statusCode, String msg) {
-		return getResponseData(false, statusCode, null, msg);
-	}
-
-	public static <T> HttpResponseResult<T> failed(HttpStatus statusCode, T data, String msg) {
-		return getResponseData(false, statusCode, data, msg);
-	}
-
-	private static <T> HttpResponseResult<T> getResponseData(boolean status, HttpStatus statusCode, T data, String message) {
-		HttpResponseResult<T> obj = new HttpResponseResult<T>();
-		obj.setStatus(status);
-		obj.setCode(statusCode.value());
-		obj.setData(data);
-		obj.setMsg(message);
-		return obj;
-	}
-
-	/**
-	 * 处理一般异常
-	 *
-	 * @param ex
-	 * @param request
-	 * @return
-	 */
-	@ExceptionHandler(Exception.class)
-	public HttpResponseResult<String> handleException(Exception ex, HttpServletRequest request) {
-		Throwable e = ExceptionUtils.getRootCause(ex);
-		if (e == null) {
-			e = ex;
-		}
-		logger.error("System Error", e);
-		// return failed(e.getMessage());
-		if (e instanceof BizException || e instanceof ThirdpartyException) {
-			if(e.getMessage().equals("205")){
-				return failed(HttpStatus.RESET_CONTENT,e.getMessage());
-			}
-			return failed(e.getMessage());
-		} else if (e instanceof AccessDeniedException) {
-			return failed("禁止访问");
-		}else if(e instanceof BindException){
-			String errors = ((BindException) e).getFieldErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining("\n"));
-			return failed(errors);
-		} else if(e instanceof MethodArgumentNotValidException){
+    private final static Logger logger = LoggerFactory.getLogger(BaseController.class);
+
+    public static <T> HttpResponseResult<T> succeed(T object) {
+        return getResponseData(true, HttpStatus.OK, object, "");
+    }
+
+    public static <T> HttpResponseResult<T> succeed() {
+        return getResponseData(true, HttpStatus.OK, null, "");
+    }
+
+    public static <T> HttpResponseResult<T> succeedData(T obj) {
+        return getResponseData(true, HttpStatus.OK, obj, "操作成功");
+    }
+
+    public static <T> HttpResponseResult<T> warned(String message) {
+        return failed(HttpStatus.MULTI_STATUS, message);
+    }
+
+    public static <T> HttpResponseResult<T> failed() {
+        return failed("");
+    }
+
+    public static <T> HttpResponseResult<T> failed(String msg) {
+        return failed(HttpStatus.INTERNAL_SERVER_ERROR, msg);
+    }
+
+    public static <T> HttpResponseResult<T> failed(HttpStatus statusCode, String msg) {
+        return getResponseData(false, statusCode, null, msg);
+    }
+
+    public static <T> HttpResponseResult<T> failed(HttpStatus statusCode, T data, String msg) {
+        return getResponseData(false, statusCode, data, msg);
+    }
+
+    private static <T> HttpResponseResult<T> getResponseData(boolean status, HttpStatus statusCode, T data, String message) {
+        HttpResponseResult<T> obj = new HttpResponseResult<T>();
+        obj.setStatus(status);
+        obj.setCode(statusCode.value());
+        obj.setData(data);
+        obj.setMsg(message);
+        return obj;
+    }
+
+    private static <T> HttpResponseResult<T> getResponseData(boolean status, int statusCode, T data, String message) {
+        HttpResponseResult<T> obj = new HttpResponseResult<T>();
+        obj.setStatus(status);
+        obj.setCode(statusCode);
+        obj.setData(data);
+        obj.setMsg(message);
+        return obj;
+    }
+
+    /**
+     * 处理一般异常
+     *
+     * @param ex
+     * @param request
+     * @return
+     */
+    @ExceptionHandler(Exception.class)
+    public HttpResponseResult<String> handleException(Exception ex, HttpServletRequest request) {
+        Throwable e = ExceptionUtils.getRootCause(ex);
+        if (e == null) {
+            e = ex;
+        }
+        logger.error("System Error", e);
+        // return failed(e.getMessage());
+        if (e instanceof BizException || e instanceof ThirdpartyException) {
+            if(e.getMessage().equals("205")){
+                return failed(HttpStatus.RESET_CONTENT,e.getMessage());
+            }
+
+            // 自定义错误码
+            if (e instanceof BizException) {
+                BizException bizException = (BizException) e;
+                return getResponseData(false, bizException.getCode(), null, bizException.getMessage());
+            }
+
+            // 默认返回错误码
+            return failed(e.getMessage());
+        } else if (e instanceof AccessDeniedException) {
+            return failed("禁止访问");
+        }else if(e instanceof BindException){
+            String errors = ((BindException) e).getFieldErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining("\n"));
+            return failed(errors);
+        } else if(e instanceof MethodArgumentNotValidException){
             MethodArgumentNotValidException validException = (MethodArgumentNotValidException) ex;
             String errorMsg = validException.getBindingResult()
                     .getFieldErrors()
@@ -109,23 +126,23 @@ public class BaseController {
                     .collect(Collectors.joining());
             return failed(errorMsg);
         }
-		try {
-			Map<String,Object> paramMap = new HashMap<>(2);
-			JSONObject jsonObject = new JSONObject();
-			jsonObject.put("content","系统繁忙请及时处理: " + request.getRequestURL() + "   " + e);
-			paramMap.put("text",jsonObject.toJSONString());
-			paramMap.put("msgtype","text");
-			Map<String,String> headers = new HashMap<>(1);
-			headers.put("Content-Type","application/json");
-			HttpUtil.postForHttps(dingTalkRobotsSecurityParam(),JSON.toJSONString(paramMap),headers);
-		}catch (Exception exception){
-			logger.error("System Error", exception);
-		}
+        try {
+            Map<String,Object> paramMap = new HashMap<>(2);
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("content","系统繁忙请及时处理: " + request.getRequestURL() + "   " + e);
+            paramMap.put("text",jsonObject.toJSONString());
+            paramMap.put("msgtype","text");
+            Map<String,String> headers = new HashMap<>(1);
+            headers.put("Content-Type","application/json");
+            HttpUtil.postForHttps(dingTalkRobotsSecurityParam(),JSON.toJSONString(paramMap),headers);
+        }catch (Exception exception){
+            logger.error("System Error", exception);
+        }
         if (StringUtils.isNotBlank(e.getMessage())) {
             return failed(e.getMessage());
         }
-		return failed("系统繁忙");
-	}
+        return failed("系统繁忙");
+    }
 
     public String dingTalkRobotsSecurityParam() throws Exception{
         Long timestamp = System.currentTimeMillis();

+ 40 - 29
mec-common/common-core/src/main/java/com/ym/mec/common/exception/BizException.java

@@ -4,33 +4,44 @@ import com.ym.mec.util.string.MessageFormatter;
 
 public class BizException extends RuntimeException {
 
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -4562885563376566463L;
-
-	public BizException() {
-		super();
-	}
-
-	public BizException(String message) {
-		super(message);
-	}
-
-	public BizException(Throwable cause) {
-		super(cause);
-	}
-
-	public BizException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	public BizException(String message, Object... arguments) {
-		super(MessageFormatter.arrayFormat(message, arguments));
-	}
-
-	public BizException(String message, Throwable cause, Object... args) {
-		super(MessageFormatter.arrayFormat(message, args), cause);
-	}
-
+    private int code = 500;
+    /**
+     *
+     */
+    private static final long serialVersionUID = -4562885563376566463L;
+
+    public BizException() {
+        super();
+    }
+
+    public BizException(String message) {
+        super(message);
+    }
+
+    public BizException(Integer code, String message) {
+        super(message);
+        // 统一错误码
+        this.code = code;
+    }
+
+    public BizException(Throwable cause) {
+        super(cause);
+    }
+
+    public BizException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public BizException(String message, Object... arguments) {
+        super(MessageFormatter.arrayFormat(message, arguments));
+    }
+
+    public BizException(String message, Throwable cause, Object... args) {
+        super(MessageFormatter.arrayFormat(message, args), cause);
+    }
+
+    public int getCode() {
+        return code;
+    }
 }
+

+ 1 - 0
mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java

@@ -49,6 +49,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 "/studentCompetition/get","/musicGroup/preRegister",
                 "/tenantInfo/queryTenantInfoByOrgan/**",
                 "/subject/list","/tenantApply/add","/questionnaireUserResult/add","/questionnaireTopic/getDetail",
+                "/open/**", "/liveGoodsMapper/page", "/liveGoodsMapper/getGoodsDetail",
                 "/musicEnlightenmentQuestionnaire/addEnlightenmentQuestionnaire", "/musicEnlightenmentQuestionnaire/getUserMusicEnlightenmentQuestionnaire").permitAll().anyRequest().authenticated().and().httpBasic();
     }
 

+ 5 - 2
mec-student/src/main/java/com/ym/mec/student/controller/ImLiveBroadcastRoomController.java

@@ -56,8 +56,11 @@ public class ImLiveBroadcastRoomController extends BaseController {
 
     @ApiOperation("学生-进入房间")
     @GetMapping("/joinRoom")
-    public HttpResponseResult<Object> joinRoom(String roomUid, Integer userId) {
-        imLiveBroadcastRoomService.joinRoom(roomUid, userId);
+    public HttpResponseResult<Object> joinRoom(String roomUid, Integer userId,Boolean microphoneFlag) {
+        if (microphoneFlag == null) {
+            microphoneFlag = true;
+        }
+        imLiveBroadcastRoomService.joinRoom(roomUid, userId,microphoneFlag);
         return succeed();
     }
 

+ 104 - 0
mec-student/src/main/java/com/ym/mec/student/controller/open/OpenLiveBroadcastRoomController.java

@@ -0,0 +1,104 @@
+package com.ym.mec.student.controller.open;
+
+import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.ImUserState;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 直播房间开放接口
+ *
+ */
+@Api(tags = "直播房间开放接口")
+@RestController
+@RequestMapping("/open/liveBroadcastRoom")
+public class OpenLiveBroadcastRoomController extends BaseController {
+
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
+    @ApiOperation("直播间游客微信身份")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "code", value = "微信身份code", required = true, dataType = "String"),
+    })
+    @GetMapping("/visitorFingerprint")
+    public HttpResponseResult<String> visitorFingerprint(@RequestParam String code) {
+
+        // 游客访问直播间凭据信息
+        return succeed(imLiveBroadcastRoomService.visitorFingerprint(code));
+    }
+
+    @ApiOperation("直播间游客访问凭据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomUid", value = "直播间编号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "fingerprint", value = "游客凭据", required = true, dataType = "String")
+    })
+    @GetMapping("/visitorCredentials")
+    public HttpResponseResult<RoomUserInfoVo> visitorCredentials(@RequestParam String roomUid,
+                                                                 @RequestParam String fingerprint) {
+
+        // 游客访问直播间凭据信息
+        return succeed(imLiveBroadcastRoomService.getVisitorCredentials(roomUid, fingerprint));
+    }
+
+
+    @ApiOperation("游客查询房间信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomUid", value = "房间编号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "userId", value = "游客编号", required = true, dataType = "Integer"),
+    })
+    @GetMapping("/visitorRoomInfo")
+    public HttpResponseResult<ImLiveBroadcastRoomVo> visitorRoomInfo(@RequestParam String roomUid, @RequestParam Integer userId) {
+
+        return succeed(imLiveBroadcastRoomService.visitorRoomInfo(roomUid, userId));
+    }
+
+    @ApiOperation("游客-进入房间")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomUid", value = "房间编号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "userId", value = "游客编号", required = true, dataType = "Integer"),
+    })
+    @GetMapping("/visitorJoinRoom")
+    public HttpResponseResult<Object> visitorJoinRoom(@RequestParam String roomUid, @RequestParam Integer userId) {
+
+        // 校验请求参数
+        if (StringUtils.isAnyBlank(roomUid) || Objects.isNull(userId)) {
+            throw new BizException("请求参数错误");
+        }
+
+        // 游客加入直播间
+        imLiveBroadcastRoomService.visitorJoinRoom(roomUid, userId);
+
+        return succeed();
+    }
+
+    @ApiOperation("游客退出直播间")
+    @PostMapping("/visitorQuitRoom")
+    public HttpResponseResult<Object> visitorQuitRoom(@RequestBody List<ImUserState> userState) {
+        imLiveBroadcastRoomService.opsRoom(userState);
+        return succeed();
+    }
+
+}
+

+ 37 - 0
mec-student/src/main/java/com/ym/mec/student/controller/open/OpenSysConfigController.java

@@ -0,0 +1,37 @@
+package com.ym.mec.student.controller.open;
+
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** 
+ * 系统配置控制层
+ */
+@RestController
+@Api(tags = "系统参数设置")
+@RequestMapping(value = "open/sysConfig")
+public class OpenSysConfigController extends BaseController {
+
+	@Autowired
+	private SysConfigService sysConfigService;
+
+	@ApiOperation(value = "查询参数")
+	@GetMapping(value = "queryByParamName")
+	public Object queryByParamName(String paramName) {
+		if(StringUtils.isBlank(paramName)){
+			return failed("参数不能为空");
+		}
+		return succeed(sysConfigService.findByParamName(paramName));
+	}
+}

+ 2 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomMemberController.java

@@ -52,6 +52,8 @@ public class ImLiveBroadcastRoomMemberController extends BaseController {
             @ApiImplicitParam(name = "roomUid", dataType = "String", value = "房间uid"),
             @ApiImplicitParam(name = "onlineStatus", dataType = "String ", value = "0:离线 1:在线  不传是全部"),
             @ApiImplicitParam(name = "whetherMicStatus", dataType = "String", value = "连麦状态 0:未申请1:申请连麦中2:连麦中"),
+            @ApiImplicitParam(name = "excludeBlacklist", dataType = "Integer", value = "黑名单排除 0:不排除 1:排除"),
+            @ApiImplicitParam(name = "visitorQuery", dataType = "Integer", value = "游客查询 0:学员 1:游客"),
             @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
             @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
     })

+ 1 - 1
mec-web/src/main/resources/bootstrap-local.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=43.137.4.92:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=d0699206-ca95-4404-a20d-420864a8029f
+spring.cloud.nacos.config.namespace=fcc00e52-a464-4ab8-96aa-3469b3f66062
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}