index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <template>
  2. <div class="profile-wrap">
  3. <div class="uid">用户id:{{ userInfo?.id }}</div>
  4. <div class="avatar">
  5. <span class="txt">用户头像:</span>
  6. <Avatar
  7. :avatar="userInfo?.avatar"
  8. :size="30"
  9. ></Avatar>
  10. </div>
  11. <div class="username">用户昵称:{{ userInfo?.username }}</div>
  12. <div class="pull-url">
  13. <span>直播间:</span>
  14. <span
  15. v-if="!userInfo?.live_rooms?.length"
  16. class="link"
  17. @click="openLiveRoom"
  18. >
  19. 未开通
  20. </span>
  21. <div v-else>
  22. <div>直播间名字:{{ userInfo?.live_rooms?.[0].name }}</div>
  23. <div>
  24. 直播间地址1(webrtc开播时):https://live.hsslive.cn/pull/<span>
  25. {{ userInfo?.live_rooms?.[0].id }}?liveType=webrtcPull
  26. </span>
  27. </div>
  28. <div>
  29. 直播间地址2(srs-webrtc开播时):https://live.hsslive.cn/pull/<span>
  30. {{ userInfo?.live_rooms?.[0].id }}?liveType=srsWebrtcPull
  31. </span>
  32. </div>
  33. <div>
  34. 直播间地址3(srs-webrtc开播或obs推流时):https://live.hsslive.cn/pull/<span>
  35. {{ userInfo?.live_rooms?.[0].id }}?liveType=srsFlvPull
  36. </span>
  37. </div>
  38. <div
  39. v-loading="keyLoading"
  40. class="rtmp-url"
  41. >
  42. <span>
  43. 推流地址:{{
  44. newRtmpUrl || handleUrl(userInfo?.live_rooms?.[0].rtmp_url!)
  45. }},
  46. </span>
  47. <span
  48. class="link"
  49. @click="handleCopy"
  50. >
  51. 复制
  52. </span>
  53. <span>,</span>
  54. <span
  55. class="link"
  56. @click="handleUpdateKey"
  57. >
  58. 更新
  59. </span>
  60. </div>
  61. </div>
  62. </div>
  63. </div>
  64. </template>
  65. <script lang="ts" setup>
  66. import { copyToClipBoard, openToTarget } from 'billd-utils';
  67. import { onMounted, ref } from 'vue';
  68. import { useRouter } from 'vue-router';
  69. import { fetchUpdateLiveRoomKey } from '@/api/liveRoom';
  70. import { fetchUserInfo } from '@/api/user';
  71. import { loginTip } from '@/hooks/use-login';
  72. import { IUser, LiveRoomTypeEnum, LiveTypeEnum } from '@/interface';
  73. import { routerName } from '@/router';
  74. const newRtmpUrl = ref();
  75. const keyLoading = ref(false);
  76. const router = useRouter();
  77. const userInfo = ref<IUser>();
  78. async function handleUserInfo() {
  79. const res = await fetchUserInfo();
  80. if (res.code === 200) {
  81. userInfo.value = res.data;
  82. }
  83. }
  84. function handleCopy() {
  85. copyToClipBoard(
  86. newRtmpUrl.value || handleUrl(userInfo.value?.live_rooms?.[0].rtmp_url!)
  87. );
  88. window.$message.success('复制成功!');
  89. }
  90. function openLiveRoom() {
  91. if (!loginTip()) {
  92. return;
  93. }
  94. const url = router.resolve({
  95. name: routerName.push,
  96. query: { liveType: LiveTypeEnum.srsWebrtcPull },
  97. });
  98. openToTarget(url.href);
  99. }
  100. function handleUrl(rtmpUrl: string) {
  101. let resUrl = '';
  102. if (rtmpUrl.indexOf('type=') === -1) {
  103. resUrl += `${rtmpUrl}&type=${LiveRoomTypeEnum.user_obs}`;
  104. } else {
  105. resUrl = rtmpUrl.replace(
  106. /type=([0-9]+)/,
  107. `type=${LiveRoomTypeEnum.user_obs}`
  108. );
  109. }
  110. return resUrl;
  111. }
  112. async function handleUpdateKey() {
  113. try {
  114. keyLoading.value = true;
  115. const res = await fetchUpdateLiveRoomKey();
  116. if (res.code === 200) {
  117. const resUrl = handleUrl(res.data.rtmp_url as string);
  118. newRtmpUrl.value = resUrl;
  119. }
  120. } catch (error) {
  121. console.log(error);
  122. } finally {
  123. keyLoading.value = false;
  124. }
  125. }
  126. onMounted(() => {
  127. handleUserInfo();
  128. });
  129. </script>
  130. <style lang="scss" scoped>
  131. .profile-wrap {
  132. padding: 10px;
  133. .link {
  134. color: $theme-color-gold;
  135. text-decoration: none;
  136. cursor: pointer;
  137. }
  138. .avatar {
  139. display: flex;
  140. align-items: center;
  141. .txt {
  142. margin-right: 10px;
  143. }
  144. }
  145. .rtmp-url {
  146. position: relative;
  147. }
  148. }
  149. </style>