index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. <template
  36. v-if="
  37. userStore.auths?.find(
  38. (v) => v.auth_value === DEFAULT_AUTH_INFO.LIVE_PUSH.auth_value
  39. )
  40. "
  41. >
  42. <div
  43. v-loading="keyLoading"
  44. class="rtmp-url"
  45. >
  46. <span>
  47. 推流地址:{{
  48. newRtmpUrl ||
  49. handleUrl({
  50. url: userInfo?.live_rooms?.[0].rtmp_url!,
  51. token: userInfo?.live_rooms?.[0].key!,
  52. })
  53. }},
  54. </span>
  55. <span
  56. class="link"
  57. @click="handleCopy"
  58. >
  59. 复制
  60. </span>
  61. <span>,</span>
  62. <span
  63. class="link"
  64. @click="handleUpdateKey"
  65. >
  66. 更新
  67. </span>
  68. </div>
  69. </template>
  70. </div>
  71. </div>
  72. </div>
  73. </template>
  74. <script lang="ts" setup>
  75. import { copyToClipBoard, openToTarget } from 'billd-utils';
  76. import { onMounted, ref } from 'vue';
  77. import { useRouter } from 'vue-router';
  78. import { fetchUpdateLiveRoomKey } from '@/api/liveRoom';
  79. import { fetchUserInfo } from '@/api/user';
  80. import { DEFAULT_AUTH_INFO, SRS_CB_URL_PARAMS } from '@/constant';
  81. import { loginTip } from '@/hooks/use-login';
  82. import { routerName } from '@/router';
  83. import { useUserStore } from '@/store/user';
  84. import { LiveRoomTypeEnum } from '@/types/ILiveRoom';
  85. import { IUser } from '@/types/IUser';
  86. import { getLiveRoomPageUrl } from '@/utils';
  87. const newRtmpUrl = ref();
  88. const keyLoading = ref(false);
  89. const router = useRouter();
  90. const userStore = useUserStore();
  91. const userInfo = ref<IUser>();
  92. async function handleUserInfo() {
  93. const res = await fetchUserInfo();
  94. if (res.code === 200) {
  95. userInfo.value = res.data;
  96. }
  97. }
  98. function handleCopy() {
  99. copyToClipBoard(
  100. newRtmpUrl.value ||
  101. handleUrl({
  102. url: userInfo.value?.live_rooms?.[0].rtmp_url!,
  103. token: userInfo.value?.live_rooms?.[0].key!,
  104. })
  105. );
  106. window.$message.success('复制成功!');
  107. }
  108. function openLiveRoom() {
  109. if (!loginTip()) {
  110. return;
  111. }
  112. const url = router.resolve({
  113. name: routerName.push,
  114. query: { liveType: LiveRoomTypeEnum.user_srs },
  115. });
  116. openToTarget(url.href);
  117. }
  118. function handleUrl(data: { url: string; token: string }) {
  119. return `${data.url}?${SRS_CB_URL_PARAMS.publishKey}=${data.token}&${SRS_CB_URL_PARAMS.publishType}=${LiveRoomTypeEnum.user_obs}`;
  120. }
  121. async function handleUpdateKey() {
  122. try {
  123. keyLoading.value = true;
  124. const res = await fetchUpdateLiveRoomKey();
  125. if (res.code === 200) {
  126. const resUrl = handleUrl({ url: res.data.rtmp_url, token: res.data.key });
  127. newRtmpUrl.value = resUrl;
  128. }
  129. } catch (error) {
  130. console.log(error);
  131. } finally {
  132. keyLoading.value = false;
  133. }
  134. }
  135. onMounted(() => {
  136. handleUserInfo();
  137. });
  138. </script>
  139. <style lang="scss" scoped>
  140. .profile-wrap {
  141. padding: 10px;
  142. .link {
  143. color: $theme-color-gold;
  144. text-decoration: none;
  145. cursor: pointer;
  146. }
  147. .avatar {
  148. display: flex;
  149. align-items: center;
  150. .txt {
  151. margin-right: 10px;
  152. }
  153. }
  154. .rtmp-url {
  155. position: relative;
  156. }
  157. }
  158. </style>