index.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. :border="!userInfo?.avatar?.length"
  13. ></Avatar>
  14. </div>
  15. <div class="username">用户昵称:{{ userInfo?.username }}</div>
  16. <div
  17. class="username"
  18. v-if="userStore.userInfo"
  19. >
  20. 用户角色:{{ userInfo?.roles?.map((item) => item.role_name).join(',') }}
  21. </div>
  22. <br />
  23. <div class="pull-url">
  24. <span
  25. v-if="
  26. !userInfo?.live_rooms?.length &&
  27. userStore.userInfo?.id === userInfo?.id
  28. "
  29. class="link"
  30. @click="openLiveRoom"
  31. >
  32. 未开通
  33. </span>
  34. <span v-else-if="!userInfo?.live_rooms?.length">
  35. 该用户未开通直播间
  36. </span>
  37. <div v-else>
  38. <div>
  39. 直播间地址:
  40. <a
  41. :href="getLiveRoomPageUrl(userInfo?.live_rooms?.[0]?.id!)"
  42. class="link"
  43. target="_blank"
  44. >
  45. {{ getLiveRoomPageUrl(userInfo?.live_rooms?.[0]?.id!) }}
  46. </a>
  47. </div>
  48. <div>直播间名称:{{ userInfo?.live_rooms?.[0]?.name }}</div>
  49. <div>
  50. 直播间简介:{{ userInfo?.live_rooms?.[0]?.desc || '暂无简介' }}
  51. </div>
  52. <div>
  53. 直播间分区:{{
  54. userInfo.live_rooms[0]?.areas?.[0]?.name || '暂无分区'
  55. }}
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </template>
  61. <script lang="ts" setup>
  62. import { openToTarget } from 'billd-utils';
  63. import { ref, watchEffect } from 'vue';
  64. import { useRoute, useRouter } from 'vue-router';
  65. import { fetchFindUser } from '@/api/user';
  66. import { loginTip } from '@/hooks/use-login';
  67. import { routerName } from '@/router';
  68. import { useUserStore } from '@/store/user';
  69. import { LiveRoomTypeEnum } from '@/types/ILiveRoom';
  70. import { IUser } from '@/types/IUser';
  71. import { getLiveRoomPageUrl } from '@/utils';
  72. const userStore = useUserStore();
  73. const route = useRoute();
  74. const router = useRouter();
  75. const userId = ref(-1);
  76. const userInfo = ref<IUser>();
  77. const getUserLoading = ref(false);
  78. watchEffect(() => {
  79. if (route.params.id) {
  80. userId.value = Number(route.params.id as string);
  81. handleUserInfo();
  82. }
  83. });
  84. async function handleUserInfo() {
  85. try {
  86. getUserLoading.value = true;
  87. const res = await fetchFindUser(userId.value);
  88. if (res.code === 200) {
  89. userInfo.value = res.data;
  90. }
  91. } catch (error) {
  92. console.error(error);
  93. } finally {
  94. getUserLoading.value = false;
  95. }
  96. }
  97. function openLiveRoom() {
  98. if (!loginTip()) {
  99. return;
  100. }
  101. const url = router.resolve({
  102. name: routerName.push,
  103. query: { liveType: LiveRoomTypeEnum.srs },
  104. });
  105. openToTarget(url.href);
  106. }
  107. </script>
  108. <style lang="scss" scoped>
  109. .profile-wrap {
  110. position: relative;
  111. padding: 10px;
  112. .link {
  113. color: $theme-color-gold;
  114. text-decoration: none;
  115. cursor: pointer;
  116. }
  117. .avatar {
  118. display: flex;
  119. align-items: center;
  120. .txt {
  121. margin-right: 10px;
  122. }
  123. }
  124. .url-wrap {
  125. position: relative;
  126. margin-top: 10px;
  127. .cdn {
  128. margin-bottom: 10px;
  129. }
  130. }
  131. }
  132. </style>