| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 | import { defineComponent, onMounted, reactive, ref } from 'vue'import styles from './index.module.less'import { Grid, GridItem, Icon, Toast } from 'vant'import iconDownload from './images/icon-download.png'// import iconFirend from './images/icon-friend.png'import iconWeChat from './images/icon-wechat.png'import iconFriendRing from './images/icon-friend-ring.png'import iconLink from './images/icon-link.png'import iconLogo from '@common/images/logo.png'import shareBg from './images/share-bg.png'import audioPan from '../images/audio-pan.png'import smallLogo from '@common/images/icon_logo.png'import musicBg from './images/music-bg.png'import audioLabel from './images/audioLabel.png';import videoLabel from './images/videoLabel.png';import QRCode from 'qrcode'import { promisefiyPostMessage } from '@/helpers/native-message'import html2canvas from 'html2canvas'export default defineComponent({  name: 'sahre-model',  props: {    musicDetail: {      type: Object,      default: () => {}    },    playType:{      type: String,      default: ''    }  },  emits: ['close'],  setup(props, { emit }) {    const canvasRef = ref()    const state = reactive({      saveLoading: false,      image: null as any,      url: ''    })    const saveImg = async () => {      Toast.loading({        message: '图片生成中...',        forbidClick: true      })      setTimeout(() => {        state.saveLoading = false      }, 100)      const res = await promisefiyPostMessage({        api: 'savePicture',        content: {          base64: state.image        }      })      if (res?.content?.status === 'success') {        Toast.success('已保存到相册')      } else {        Toast.fail('保存失败')      }    }    const onSaveWe = async (type: string) => {      // Toast.loading({      //   message: '图片生成中...',      //   forbidClick: true      // })      setTimeout(() => {        state.saveLoading = false      }, 100)      const res = await promisefiyPostMessage({        api: 'shareTripartite',        content: {          title: '我在酷乐秀发布了演奏作品',          desc: props.musicDetail.desc,          // image: state.image,          video: '',          type: 'link',          url: state.url,          thumb: encodeURI(decodeURI(props.musicDetail.img)),          shareType: type        }      })      if (res?.content?.status) {        Toast.success('分享成功')      } else {        Toast.fail('分享失败')      }    }    const onSavePath = (type: string) => {      // 判断是否在保存中...      if (state.saveLoading) {        return      }      state.saveLoading = true      // 判断是否已经生成图片      if (state.image) {        if (type) {          onSaveWe(type)        } else {          saveImg()        }      } else {        const container: any = document.getElementById('shareContent')        html2canvas(container, {          allowTaint: true,          useCORS: true,          backgroundColor: null        })          .then(async canvas => {            const url = canvas.toDataURL('image/png')            state.image = url            if (type) {              onSaveWe(type)            } else {              saveImg()            }          })          .catch(() => {            Toast.clear()            state.saveLoading = false          })      }    }    const copyText = (text: string) => {      // 数字没有 .length 不能执行selectText 需要转化成字符串      const textString = text.toString()      let input = document.querySelector('#copy-input') as HTMLInputElement      if (!input) {        input = document.createElement('input')        input.id = 'copy-input'        input.readOnly = true // 防止ios聚焦触发键盘事件        input.style.position = 'fixed'        input.style.left = '-1000px'        input.style.zIndex = '-1000'        // 为了处理,页面滑动到底部的问题        document.body.appendChild(input)        // document.querySelector('#input-copy-container')?.appendChild(input)      }      input.value = textString      // ios必须先选中文字且不支持 input.select();      selectText(input, 0, textString.length)      console.log(document.execCommand('copy'), 'execCommand')      if (document.execCommand('copy')) {        document.execCommand('copy')        Toast('复制成功')      }      input.blur()      // input自带的select()方法在苹果端无法进行选择,所以需要自己去写一个类似的方法      // 选择文本。createTextRange(setSelectionRange)是input方法      function selectText(textbox: any, startIndex: any, stopIndex: any) {        if (textbox.createTextRange) {          //ie          const range = textbox.createTextRange()          range.collapse(true)          range.moveStart('character', startIndex) //起始光标          range.moveEnd('character', stopIndex - startIndex) //结束光标          range.select() //不兼容苹果        } else {          //firefox/chrome          textbox.setSelectionRange(startIndex, stopIndex)          textbox.focus()        }      }    }    onMounted(() => {      const canvas = canvasRef.value      state.url =        location.origin +        location.pathname +        '#/shareCreation?id=' +        props.musicDetail.id      QRCode.toCanvas(        canvas,        state.url,        {          margin: 1        },        (error: any) => {          if (error) console.log(error)          console.log('success')        }      )    })    return () => (      <div class={styles.shareModel}>        <div class={styles.shareContent} id="shareContent">          <img src={shareBg} class={styles.shareBg} />          <div class={styles.share_content__title}>            <p class={styles.large}>我在酷乐秀发布了演奏作品</p>            <p class={styles.small}>赶快扫码看看吧!</p>          </div>          <div class={[styles.share_music__container, styles.sectionFile]}>            <div class={styles.uploadImg}>              <img                src={audioPan}                class={styles.audioPan}                crossorigin="anonymous"              />              <img                src={                  props.musicDetail.img                    ? props.musicDetail.img + '?t' + new Date().getTime()                    : musicBg                }                class={styles.muploader}                crossorigin="anonymous"              />              <img class={styles.imgLabel} src={props.playType === "Audio" ? audioLabel : videoLabel} />            </div>            <div class={styles.musicDetail}>              <p class={[styles.musicName, 'van-ellipsis']}>                {props.musicDetail.musicSheetName}              </p>              <p class={styles.username}>                演奏者:{props.musicDetail.username}              </p>            </div>          </div>          <div class={styles.downloadSection}>            <div class={styles.qrcode}>              <canvas ref={canvasRef} class={styles.qrcodeCanvas}></canvas>              <img src={smallLogo} class={styles.qrcodeLogo} />            </div>            <div class={styles.qrtips}>              <div>温馨提示:</div>              <p class={styles.tip}>                保存图片到相册后,请在微信里扫码查看~              </p>              <img src={iconLogo} class={styles.iconLogo} />              {/* <p class={styles.downTip}>扫码下载音乐数字课堂App</p> */}            </div>          </div>        </div>        <div class={styles.shareBottom}>          <Icon            name="cross"            class={styles.iconClose}            onClick={() => emit('close')}          />          <div class={styles.share__header}>海报已生成!快来分享吧!</div>          <Grid columnNum={5} border={false} class={styles.gridSection}>            <GridItem              icon={iconDownload}              text="保存本地"              onClick={() => onSavePath('')}            ></GridItem>            {/* <GridItem icon={iconFirend} text="群聊"></GridItem> */}            <GridItem              icon={iconWeChat}              text="微信好友"              onClick={() => onSavePath('wechat')}            ></GridItem>            <GridItem              icon={iconFriendRing}              text="朋友圈"              onClick={() => onSavePath('wechat_circle')}            ></GridItem>            <GridItem              icon={iconLink}              text="复制链接"              onClick={() => copyText(state.url)}            ></GridItem>          </Grid>          <div            class={[styles.btn, 'van-hairline--top']}            onClick={() => emit('close')}          >            取消          </div>        </div>      </div>    )  }})
 |