index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <route lang="json">
  2. {
  3. "style": {
  4. "navigationStyle": "custom"
  5. }
  6. }
  7. </route>
  8. <script setup lang="ts">
  9. import MomentItem from '@/components/moment-item.vue'
  10. import { getCircles, getDesignerInfo, getUserInfoById } from '../../../core/libs/requests'
  11. import { useUserStore } from '../../../store'
  12. import { storeToRefs } from 'pinia'
  13. import { NetImages } from '../../../core/libs/net-images'
  14. import PageHelper from '@/components/page-helper.vue'
  15. import BottomAppBar from '@/components/bottom-app-bar.vue'
  16. import { useRouter } from '../../../core/utils/router'
  17. import NavbarEvo from '@/components/navbar-evo.vue'
  18. const router = useRouter()
  19. const userStore = useUserStore()
  20. const { userInfo } = storeToRefs(userStore)
  21. const id = ref()
  22. const tab = ref('2')
  23. const tabs = ref([
  24. { label: '案例', value: '2' },
  25. { label: '动态', value: '1' },
  26. { label: '视频', value: '0' },
  27. ])
  28. const { data: memberInfo, run: setMemberInfo } = useRequest(() => getUserInfoById(id.value), {
  29. initialData: {},
  30. })
  31. const { data: designerInfo, run: setDesignerInfo } = useRequest(() => getDesignerInfo(id.value), {
  32. initialData: {},
  33. })
  34. const isOwn = computed(() => userInfo.value?.userId === id.value)
  35. const skills = computed(() => [
  36. { label: '从业年限', value: designerInfo.value.serviceYears },
  37. { label: '客户', value: designerInfo.value.serviceCustomerCount },
  38. { label: '设计费', value: `${designerInfo.value.designFee}元/㎡` },
  39. ])
  40. onMounted(async () => {})
  41. function getVideoListByAccessToken(accessToken, openid) {
  42. const VIDEO_API = 'https://api.weixin.qq.com/wxa/business/getuservideo'
  43. uni.request({
  44. url: VIDEO_API,
  45. method: 'POST',
  46. header: {
  47. 'Content-Type': 'application/json',
  48. },
  49. data: {
  50. access_token: accessToken,
  51. openid,
  52. // 可以添加其他参数,如offset, limit
  53. },
  54. success: function (res) {
  55. // 获取视频号列表成功
  56. console.log('视频号列表:', res.data)
  57. },
  58. fail: function (error) {
  59. console.log('获取视频号列表失败', error)
  60. },
  61. })
  62. }
  63. onLoad(async (query: { id: string }) => {
  64. if (query.id) {
  65. id.value = query.id
  66. await setMemberInfo()
  67. } else {
  68. id.value = userInfo.value.userId
  69. }
  70. await setDesignerInfo()
  71. // uni.request({
  72. // url: '',
  73. // })
  74. // getVideoListByAccessToken(userInfo.value.accessToken, userInfo.value.openid)
  75. })
  76. onShareAppMessage(() => ({ title: `${userInfo.value.nickname}` }))
  77. defineExpose({
  78. navBarFixed: false,
  79. })
  80. </script>
  81. <template>
  82. <div class="flex-grow flex flex-col">
  83. <NavbarEvo transparent dark></NavbarEvo>
  84. <div class="relative">
  85. <wd-img
  86. width="100%"
  87. :src="designerInfo?.homePageUrl || NetImages.DesigerHomepageDefaultBg"
  88. mode="aspectFill"
  89. custom-class="aspect-[1.14/1]"
  90. />
  91. <div class="absolute bottom-0 left-0 right-0">
  92. <div class="h-[107px] bg-gradient-to-t from-black to-transparent">
  93. <div class="flex">
  94. <div
  95. class="w-18 h-18 border-white border border-solid mx-3.5 rounded-full overflow-hidden"
  96. >
  97. <wd-img
  98. width="100%"
  99. height="100%"
  100. :src="isOwn ? userInfo?.avatar : memberInfo?.avatar"
  101. ></wd-img>
  102. </div>
  103. <div>
  104. <div class="text-white text-2xl font-normal font-['PingFang_SC'] leading-normal">
  105. {{ designerInfo?.brokerName }}
  106. </div>
  107. <div>
  108. <div
  109. class="h-6 px-2 bg-black/10 rounded-[30px] border border-white/60 justify-center items-center gap-2.5 inline-flex"
  110. >
  111. <div
  112. class="text-center text-white text-[10px] font-normal font-['PingFang_SC'] leading-normal"
  113. >
  114. 创设空间事务所创始人
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. <div class="flex-grow flex flex-col bg-white rounded-t-2xl relative bottom-4 gap-5 px-3.5 pt-5">
  124. <div class="flex gap-4">
  125. <template v-for="(it, i) in skills" :key="i">
  126. <div>
  127. <span
  128. class="mr-0.575 text-black/90 text-base font-normal font-['PingFang_SC'] leading-[26.98px]"
  129. >
  130. {{ it.value }}
  131. </span>
  132. <span
  133. class="text-center text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[26.98px]"
  134. >
  135. {{ it.label }}
  136. </span>
  137. </div>
  138. <div v-if="i < skills?.length - 1" class="leading-[26.98px] text-black/60">|</div>
  139. </template>
  140. </div>
  141. <div class="text-black/80 text-sm font-normal font-['PingFang_SC'] leading-normal">
  142. “设计没有风格,设计是对生活的一种诠释,不是所谓的造型与装饰!”
  143. </div>
  144. <wd-tabs v-model="tab" custom-class="bg-transparent!">
  145. <template v-for="({ label, value }, index) in tabs" :key="index">
  146. <wd-tab :title="label" :name="value"></wd-tab>
  147. </template>
  148. </wd-tabs>
  149. <PageHelper
  150. class="flex-grow flex flex-col bg-[#f6f6f6] mx--3.5"
  151. custom-class=""
  152. :request="getCircles"
  153. :query="{ circleType: tab, stylistId: id }"
  154. >
  155. <template #default="{ source }">
  156. <div class="p-3.5 flex flex-col bg-[#f6f6f6] gap-3.5">
  157. <template v-for="it of source.list" :key="it.id">
  158. <view class="">
  159. <MomentItem :options="it"></MomentItem>
  160. </view>
  161. </template>
  162. </div>
  163. </template>
  164. </PageHelper>
  165. </div>
  166. <BottomAppBar fixed placeholder>
  167. <div class="flex gap-7.5">
  168. <div class="flex-1" v-if="userInfo.userId === Number(id)">
  169. <wd-button block :round="false" @click="router.push(`/pages/mine/homepage/edit/index`)">
  170. 编辑
  171. </wd-button>
  172. </div>
  173. <div class="flex-1" v-if="userInfo.userId === Number(id)">
  174. <wd-button block :round="false" open-type="share">分享</wd-button>
  175. </div>
  176. <div class="flex-1" v-if="userInfo.userId !== Number(id)">
  177. <wd-button
  178. block
  179. :round="false"
  180. @click="router.push(`/pages/mine/homepage/consult/index`)"
  181. >
  182. 预约咨询
  183. </wd-button>
  184. </div>
  185. </div>
  186. </BottomAppBar>
  187. </div>
  188. </template>