expoPopover.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <script>
  2. import Vue from 'vue'
  3. import { getMyExpoInfo } from '@/api/expo'
  4. export default Vue.extend({
  5. name: 'ExpoPopover',
  6. props: {
  7. expoId: String,
  8. placement: String,
  9. trigger: String
  10. },
  11. data() {
  12. return {
  13. popover_data: {},
  14. ossUrl: process.env.VUE_APP_OSS_DOMAIN
  15. }
  16. },
  17. methods: {
  18. goto(url) {
  19. window.open(url, '_blank')
  20. },
  21. getDetail(id) {
  22. getMyExpoInfo(id).then(res => {
  23. this.popover_data = res.data
  24. this.popover_data.images = JSON.parse(res.data.images)
  25. this.popover_data.social_links = JSON.parse(res.data.social_links)
  26. if (this.popover_data.social_links.facebook === '' || this.popover_data.social_links.twitter === '' || this.popover_data.social_links.linkedin === '') {
  27. this.popover_data.social_links = false
  28. }
  29. })
  30. },
  31. copyUrl() {
  32. const rootPath = window.location.origin
  33. navigator.clipboard.writeText(rootPath + '/register/' + this.popover_data.urla)
  34. this.$message.success('复制成功')
  35. }
  36. }
  37. })
  38. </script>
  39. <template>
  40. <el-popover popper-class="popover" :trigger="trigger" :placement="placement" width="600" @show="popover_data={}" @after-enter="getDetail(expoId)">
  41. <div class="expo-info">
  42. <div class="cover loading">
  43. <img v-if="popover_data.images" :src="ossUrl+popover_data.images[0]">
  44. <div v-if="popover_data.form_template_id && popover_data.urla" v-permission="'exhibitor.copyLink'" class="button" @click="copyUrl()">复制表单地址</div>
  45. </div>
  46. <div class="info-body">
  47. <div class="avatar-name">
  48. <div class="avatar loading">
  49. <img v-if="popover_data.logo" :src="ossUrl+popover_data.logo">
  50. </div>
  51. <div class="name-cont">
  52. <div :class="['name',popover_data.expo_name!==undefined?'':'loading']">{{ popover_data.expo_name }}</div>
  53. <div :class="['sub-name',popover_data.organizer!==undefined?'':'loading']">{{ popover_data.organizer }}</div>
  54. <div class="contact">
  55. <div class="phone">
  56. <i class="icon el-icon-mobile-phone" />
  57. <div :class="['phone-num link',popover_data.contact_phone!==undefined?'':'loading']" @click="goto('tel:'+popover_data.contact_phone)">{{ popover_data.contact_phone }}</div>
  58. </div>
  59. <div class="email">
  60. <i class="icon el-icon-message" />
  61. <div :class="['email-addr link',popover_data.contact_email!==undefined?'':'loading']" @click="goto('mailto:'+popover_data.contact_email)">{{ popover_data.contact_email }}</div>
  62. </div>
  63. <div class="date">
  64. <i class="icon el-icon-date" />
  65. <div :class="['date-range',popover_data.start_date!==undefined?'':'loading']">{{ popover_data.start_date }} - {{ popover_data.end_date }}</div>
  66. </div>
  67. </div>
  68. </div>
  69. </div>
  70. <div v-html="popover_data.content" :class="['desc',popover_data.content!==undefined?'':'loading']">
  71. </div>
  72. <div v-if="popover_data.social_links" class="social_links">
  73. <div class="social-title">社交媒体</div>
  74. <div v-if="popover_data.social_links.facebook" class="social-item">
  75. <span>facebook:</span><span class="link" @click="goto(popover_data.social_links.facebook)">{{ popover_data.social_links.facebook }}</span>
  76. </div>
  77. <div v-if="popover_data.social_links.twitter" class="social-item">
  78. <span>twitter:</span><span class="link" @click="goto(popover_data.social_links.twitter)">{{ popover_data.social_links.twitter }}</span>
  79. </div>
  80. <div v-if="popover_data.social_links.linkedin" class="social-item">
  81. <span>linkedin:</span><span class="link" @click="goto(popover_data.social_links.linkedin)">{{ popover_data.social_links.linkedin }}</span>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. <span slot="reference" class="button">
  87. <slot />
  88. </span>
  89. </el-popover>
  90. </template>
  91. <style>
  92. .popover{
  93. overflow: hidden;
  94. padding: 0;
  95. .expo-info{
  96. position: relative;
  97. width: 100%;
  98. .link{
  99. cursor: pointer;
  100. text-decoration: underline;
  101. }
  102. .info-body{
  103. padding: 16px;
  104. .social_links{
  105. margin-top: 12px;
  106. .social-title{
  107. font-weight: bold;
  108. }
  109. .social-item{
  110. }
  111. }
  112. .desc{
  113. max-height: 36vh;
  114. overflow: hidden;
  115. overflow-y: auto;
  116. white-space: pre-wrap;
  117. margin-top: 12px;
  118. p{
  119. margin: 0;
  120. }
  121. &.loading{
  122. height: 60px;
  123. width: 100%;
  124. }
  125. }
  126. .avatar-name{
  127. display: flex;
  128. grid-gap: 8px;
  129. .name-cont{
  130. flex: 1;
  131. .name{
  132. font-size: 20px;
  133. font-weight: bold;
  134. &.loading{
  135. height: 26px;
  136. width: 120px;
  137. }
  138. }
  139. .sub-name{
  140. color: gray;
  141. &.loading{
  142. margin-top: 8px;
  143. margin-bottom: 8px;
  144. height: 20px;
  145. width: 160px;
  146. }
  147. }
  148. .contact{
  149. flex-wrap: wrap;
  150. display: flex;
  151. grid-gap: 0 12px;
  152. .phone,.email,.date{
  153. display: flex;
  154. align-items: center;
  155. grid-gap: 4px;
  156. div{
  157. &.loading{
  158. height: 16px;
  159. width: 120px;
  160. }
  161. }
  162. }
  163. }
  164. }
  165. .avatar{
  166. width: 70px;
  167. height: 70px;
  168. border-radius: 50%;
  169. overflow: hidden;
  170. img{
  171. display: block;
  172. object-fit: cover;
  173. width: 100%;
  174. height: 100%;
  175. }
  176. }
  177. }
  178. }
  179. .cover{
  180. position: relative;
  181. width: 100%;
  182. aspect-ratio: 3/1;
  183. .button{
  184. cursor: pointer;
  185. background: #00000044;
  186. padding: 4px 12px;
  187. border-radius: 24px;
  188. border: 2px solid white;
  189. color: white;
  190. position: absolute;
  191. right: 16px;
  192. top: 16px;
  193. }
  194. img{
  195. display: block;
  196. object-fit: cover;
  197. width: 100%;
  198. height: 100%;
  199. }
  200. }
  201. }
  202. }
  203. </style>