index.vue 3.8 KB

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