index.vue 3.4 KB

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