index.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <template>
  2. <div
  3. class="profile-wrap"
  4. v-loading="getUserLoading"
  5. >
  6. <div class="uid">用户id:{{ userInfo?.id }}</div>
  7. <div class="avatar">
  8. <span class="txt">用户头像:</span>
  9. <Avatar
  10. :avatar="userInfo?.avatar"
  11. :size="30"
  12. ></Avatar>
  13. </div>
  14. <div class="username">用户昵称:{{ userInfo?.username }}</div>
  15. <div
  16. class="username"
  17. v-if="userStore.userInfo"
  18. >
  19. 用户角色:{{ userInfo?.roles?.map((item) => item.role_name).join(',') }}
  20. </div>
  21. <br />
  22. <div class="pull-url">
  23. <span
  24. v-if="
  25. !userInfo?.live_rooms?.length &&
  26. userStore.userInfo?.id === userInfo?.id
  27. "
  28. class="link"
  29. @click="openLiveRoom"
  30. >
  31. 未开通
  32. </span>
  33. <span v-else-if="!userInfo?.live_rooms?.length">
  34. 该用户未开通直播间
  35. </span>
  36. <div v-else>
  37. <div>
  38. 直播间地址:
  39. <a
  40. :href="getLiveRoomPageUrl(userInfo?.live_rooms?.[0]?.id!)"
  41. class="link"
  42. target="_blank"
  43. >
  44. {{ getLiveRoomPageUrl(userInfo?.live_rooms?.[0]?.id!) }}
  45. </a>
  46. </div>
  47. <div>直播间名称:{{ userInfo?.live_rooms?.[0]?.name }}</div>
  48. <div>
  49. 直播间简介:{{ userInfo?.live_rooms?.[0]?.desc || '暂无简介' }}
  50. </div>
  51. <div>
  52. 直播间分区:{{
  53. userInfo.live_rooms[0]?.areas?.[0]?.name || '暂无分区'
  54. }}
  55. </div>
  56. <div
  57. v-if="
  58. userStore.userInfo?.id === userInfo.id &&
  59. userStore.auths?.find(
  60. (v) => v.auth_value === DEFAULT_AUTH_INFO.LIVE_PUSH.auth_value
  61. )
  62. "
  63. class="rtmp-url-wrap"
  64. v-loading="updateKeyLoading"
  65. >
  66. <div
  67. class="link"
  68. @click="handleUpdateKey"
  69. >
  70. 更新地址
  71. </div>
  72. <div
  73. v-if="
  74. userStore.userInfo?.auths?.find(
  75. (v) =>
  76. v.auth_value === DEFAULT_AUTH_INFO.LIVE_PULL_SVIP.auth_value
  77. )
  78. "
  79. >
  80. <span>
  81. CDN推流地址:{{ handleReplaceCDNUrl(pushRes?.push_rtmp_url!) }},
  82. </span>
  83. <span
  84. class="link"
  85. @click="handleCopy(handleReplaceCDNUrl(pushRes?.push_rtmp_url!))"
  86. >
  87. 复制
  88. </span>
  89. </div>
  90. <div>
  91. <span>
  92. RTMP推流地址:{{
  93. handleReplaceRtmpUrl(pushRes?.push_rtmp_url!)
  94. }},
  95. </span>
  96. <span
  97. class="link"
  98. @click="handleCopy(handleReplaceRtmpUrl(pushRes?.push_rtmp_url!))"
  99. >
  100. 复制
  101. </span>
  102. </div>
  103. <div>
  104. <span>OBS服务器:{{ pushRes?.push_obs_server! }},</span>
  105. <span
  106. class="link"
  107. @click="handleCopy(pushRes?.push_obs_server!)"
  108. >
  109. 复制
  110. </span>
  111. </div>
  112. <div>
  113. <span>OBS推流码:{{ pushRes?.push_obs_stream_key! }},</span>
  114. <span
  115. class="link"
  116. @click="handleCopy(pushRes?.push_obs_stream_key!)"
  117. >
  118. 复制
  119. </span>
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. </template>
  126. <script lang="ts" setup>
  127. import { copyToClipBoard, openToTarget } from 'billd-utils';
  128. import { ref, watch, watchEffect } from 'vue';
  129. import { useRoute, useRouter } from 'vue-router';
  130. import { fetchUpdateLiveRoomKey } from '@/api/liveRoom';
  131. import { fetchFindUser } from '@/api/user';
  132. import { DEFAULT_AUTH_INFO } from '@/constant';
  133. import { loginTip } from '@/hooks/use-login';
  134. import { routerName } from '@/router';
  135. import { useUserStore } from '@/store/user';
  136. import { LiveRoomTypeEnum } from '@/types/ILiveRoom';
  137. import { IUser } from '@/types/IUser';
  138. import { getLiveRoomPageUrl } from '@/utils';
  139. const userStore = useUserStore();
  140. const route = useRoute();
  141. const router = useRouter();
  142. const pushRes = ref();
  143. const userId = ref(-1);
  144. const userInfo = ref<IUser>();
  145. const getUserLoading = ref(false);
  146. const updateKeyLoading = ref(false);
  147. watchEffect(() => {
  148. if (route.params.userId) {
  149. userId.value = Number(route.params.userId as string);
  150. handleUserInfo();
  151. }
  152. });
  153. watch(
  154. () => userStore.userInfo,
  155. (newval) => {
  156. if (newval) {
  157. pushRes.value = newval.live_rooms?.[0];
  158. }
  159. },
  160. { immediate: true }
  161. );
  162. function handleReplaceCDNUrl(url: string) {
  163. const reg = /pushtype=([0-9]+)/g;
  164. console.log(url.replace(reg, 'pushtype=3'));
  165. return url.replace(reg, `pushtype=${LiveRoomTypeEnum.tencent_css}`);
  166. }
  167. function handleReplaceRtmpUrl(url: string) {
  168. const reg = /pushtype=([0-9]+)/g;
  169. console.log(url.replace(reg, 'pushtype=3'));
  170. return url.replace(reg, `pushtype=${LiveRoomTypeEnum.obs}`);
  171. }
  172. async function handleUserInfo() {
  173. try {
  174. getUserLoading.value = true;
  175. const res = await fetchFindUser(userId.value);
  176. if (res.code === 200) {
  177. userInfo.value = res.data;
  178. }
  179. } catch (error) {
  180. console.error(error);
  181. } finally {
  182. getUserLoading.value = false;
  183. }
  184. }
  185. function handleCopy(url: string) {
  186. copyToClipBoard(url);
  187. window.$message.success('复制成功!');
  188. }
  189. function openLiveRoom() {
  190. if (!loginTip()) {
  191. return;
  192. }
  193. const url = router.resolve({
  194. name: routerName.push,
  195. query: { liveType: LiveRoomTypeEnum.srs },
  196. });
  197. openToTarget(url.href);
  198. }
  199. async function handleUpdateKey() {
  200. try {
  201. updateKeyLoading.value = true;
  202. const res = await fetchUpdateLiveRoomKey();
  203. if (res.code === 200) {
  204. pushRes.value = res.data;
  205. }
  206. } catch (error) {
  207. console.error(error);
  208. } finally {
  209. updateKeyLoading.value = false;
  210. }
  211. }
  212. </script>
  213. <style lang="scss" scoped>
  214. .profile-wrap {
  215. position: relative;
  216. padding: 10px;
  217. .link {
  218. color: $theme-color-gold;
  219. text-decoration: none;
  220. cursor: pointer;
  221. }
  222. .avatar {
  223. display: flex;
  224. align-items: center;
  225. .txt {
  226. margin-right: 10px;
  227. }
  228. }
  229. .rtmp-url-wrap {
  230. position: relative;
  231. }
  232. }
  233. </style>