| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | <!-- 海报弹窗 --><template>  <su-popup :show="show" round="10" @close="onClosePoster" type="center" class="popup-box">    <view class="ss-flex-col ss-col-center ss-row-center">      <image        v-if="!!painterImageUrl"        class="poster-img"        :src="painterImageUrl"        :style="{          height: poster.css.height+ 'px',          width: poster.css.width + 'px',        }"        :show-menu-by-longpress="true"      />    </view>    <view      class="poster-btn-box ss-m-t-20 ss-flex ss-row-between ss-col-center"      v-if="!!painterImageUrl"    >      <button class="cancel-btn ss-reset-button" @tap="onClosePoster">取消</button>      <button class="save-btn ss-reset-button ui-BG-Main" @tap="onSavePoster">        {{          ['wechatOfficialAccount', 'H5'].includes(sheep.$platform.name)            ? '长按图片保存'            : '保存图片'        }}      </button>    </view>    <!--  海报画板:默认隐藏只用来生成海报。生成方式为主动调用  -->    <l-painter      isCanvasToTempFilePath      pathType="url"      @success="setPainterImageUrl"      hidden      ref="painterRef"    />  </su-popup></template><script setup>  /**   * 海报生成和展示   * 提示:小程序码默认跳转首页,由首页进行 spm 参数解析后跳转到对应的分享页面   * @description 用于生成分享海报,如:分享商品海报。   * @tutorial https://ext.dcloud.net.cn/plugin?id=2389   * @property {Boolean} show   弹出层控制   * @property {Object}  shareInfo 分享信息   */  import { reactive, ref, unref } from 'vue';  import sheep from '@/sheep';  import { getPosterData } from '@/sheep/components/s-share-modal/canvas-poster/poster';  const props = defineProps({    show: {      type: Boolean,      default: false,    },    shareInfo: {      type: Object,      default: () => {      },    },  });  const poster = reactive({    css: {      // 根节点若无尺寸,自动获取父级节点      width: sheep.$platform.device.windowWidth * 0.9,      height: 600,    },    views: [],  });  const emits = defineEmits(['success', 'close']);  const onClosePoster = () => {    emits('close');  };  const painterRef = ref(); // 海报画板  const painterImageUrl = ref(); // 海报 url  // 渲染海报  const renderPoster = async () => {    await painterRef.value.render(unref(poster));  };  // 获得生成的图片  const setPainterImageUrl = (path) => {    painterImageUrl.value = path;  };  // 保存海报图片  const onSavePoster = () => {    if (['WechatOfficialAccount', 'H5'].includes(sheep.$platform.name)) {      sheep.$helper.toast('请长按图片保存');      return;    }    // 非H5 保存到相册    uni.saveImageToPhotosAlbum({      filePath: painterImageUrl.value,      success: (res) => {        onClosePoster();        sheep.$helper.toast('保存成功');      },      fail: (err) => {        sheep.$helper.toast('保存失败');        console.log('图片保存失败:', err);      },    });  };  // 获得海报数据  async function getPoster() {    painterImageUrl.value = undefined    poster.views = await getPosterData({      width: poster.css.width,      shareInfo: props.shareInfo,    });    await renderPoster();  }  defineExpose({    getPoster,  });</script><style lang="scss" scoped>  .popup-box {    position: relative;  }  .poster-title {    color: #999;  }  // 分享海报  .poster-btn-box {    width: 600rpx;    position: absolute;    left: 50%;    transform: translateX(-50%);    bottom: -80rpx;    .cancel-btn {      width: 240rpx;      height: 70rpx;      line-height: 70rpx;      background: $white;      border-radius: 35rpx;      font-size: 28rpx;      font-weight: 500;      color: $dark-9;    }    .save-btn {      width: 240rpx;      height: 70rpx;      line-height: 70rpx;      border-radius: 35rpx;      font-size: 28rpx;      font-weight: 500;    }  }  .poster-img {    border-radius: 20rpx;  }</style>
 |