123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571 |
- <template>
- <view class="content">
- <!-- 海报弹窗 -->
- <view class="cu-modal" :class="{ show: showPoster }" @tap="onClosePoster">
- <view class="cu-dialog" style="width: 640rpx;background: none;">
- <view class="poster-img-box"><image class="poster-img" :src="posterImage" mode="widthFix"></image></view>
- <view class="poster-btn-box u-m-t-20 u-flex u-row-between u-col-center" v-show="posterImage">
- <button class="cancel-btn u-reset-button" @tap="showPoster = false">取消</button>
- <button class="save-btn u-reset-button" @tap="saveImage">{{ ['wxOfficialAccount', 'H5'].includes(platform) ? '长按图片保存' : '保存图片' }}</button>
- </view>
- </view>
- </view>
- <!-- 分享tools -->
- <view class="cu-modal bottom-modal" :class="{ show: showShare }" @tap="showShare = false">
- <view class="cu-dialog safe-area-inset-bottom" style="border-radius: 20rpx 20rpx 0 0;background: none;">
- <view class="share-box">
- <view class="share-list-box u-flex">
- <!-- #ifdef MP-WEIXIN -->
- <button class="share-item share-btn u-flex-col u-col-center" open-type="share">
- <image class="share-img" :src="$IMG_URL + '/imgs/share/share_wx.png'" mode=""></image>
- <text class="share-title">微信好友</text>
- </button>
- <!-- #endif -->
- <!-- #ifndef MP-WEIXIN -->
- <view v-if="platform !== 'H5'" class="share-item u-flex-col u-col-center" @tap="shareFriend">
- <image class="share-img" :src="$IMG_URL + '/imgs/share/share_wx.png'" mode=""></image>
- <text class="share-title">微信好友</text>
- </view>
- <!-- #endif -->
- <view class="share-item u-flex-col u-col-center" @tap="onPoster">
- <image class="share-img" :src="$IMG_URL + '/imgs/share/share_poster.png'" mode=""></image>
- <text class="share-title">生成海报</text>
- </view>
- <view class="share-item u-flex-col u-col-center" @tap="copySharePath">
- <image class="share-img" :src="$IMG_URL + '/imgs/share/share_link.png'" mode=""></image>
- <text class="share-title">复制链接</text>
- </view>
- </view>
- <view class="share-foot u-flex u-row-center u-col-center" @tap="showShare = false">取消</view>
- </view>
- </view>
- </view>
- <!-- 分享指引 -->
- <view class="cu-modal bottom-modal" :class="{ show: showShareGuide }" @tap="showShareGuide = false">
- <view class="cu-dialog safe-area-inset-bottom" style="border-radius: 20rpx 20rpx 0 0;background: none;vertical-align: top;">
- <view class="guide-wrap u-flex u-col-top u-row-center"><image class="guide-img" :src="$IMG_URL + '/imgs/share/share_guide.png'" mode=""></image></view>
- </view>
- </view>
- <!-- 各海报模块 -->
- <shopro-canvas v-if="showPoster" ref="shoproCanvas" :canvasParams="canvasParams" @success="onSuccess"></shopro-canvas>
- </view>
- </template>
- <script>
- /**
- * 分享弹窗
- * @property {Boolean} value = showModal - v-model控制显隐
- * @property {String} posterType - 海报类别
- * @property {Object} posterInfo - 海报数据
- */
- import { mapMutations, mapActions, mapState, mapGetters } from 'vuex';
- import Auth from '@/shopro/permission/index.js';
- export default {
- name: 'shoproShare',
- components: {},
- data() {
- return {
- showShareGuide: false, //H5的指引。
- showPoster: false, //海报弹窗
- platform: this.$platform.get(),
- posterImage: '',
- canvasParams: {}
- };
- },
- props: {
- posterType: {
- type: String,
- default: ''
- },
- posterInfo: {
- type: Object,
- default: () => {}
- },
- value: {}
- },
- computed: {
- ...mapGetters(['initShare', 'userInfo', 'isLogin', 'shareInfo']),
- showShare: {
- get() {
- return this.value;
- },
- set(val) {
- if (!this.showPoster) {
- val ? uni.hideTabBar() : uni.showTabBar();
- }
- this.$emit('input', val);
- }
- }
- },
- created() {
- uni.$on('ON_WX_SHARE', () => {
- this.showShare = false;
- });
- },
- methods: {
- // 关闭弹窗
- onClosePoster() {
- this.showPoster = false;
- uni.showTabBar();
- },
- // 绘制成功
- onSuccess(e) {
- this.posterImage = e;
- },
- // 开始绘制
- onPoster() {
- this.posterImage = '';
- uni.hideTabBar();
- if (this.$store.getters.isLogin) {
- this.canvasParams = this.getPosterFormatter();
- this.showPoster = true;
- } else {
- this.$store.dispatch('showAuthModal', 'accountLogin');
- }
- this.showShare = false;
- },
- // 分享好友
- shareFriend() {
- let that = this;
- // #ifdef APP-PLUS
- uni.share({
- provider: 'weixin',
- scene: 'WXSceneSession',
- type: 0,
- href: that.shareInfo.path,
- title: that.shareInfo.title,
- summary: that.shareInfo.title,
- image: that.shareInfo.image,
- success: res => {
- console.log('success:' + JSON.stringify(res));
- this.showShare = false;
- },
- fail: err => {
- console.log('fail:' + JSON.stringify(err));
- }
- });
- // #endif
- // #ifdef H5
- this.showShare = false;
- this.showShareGuide = true;
- // #endif
- },
- // 保存图片
- async saveImage() {
- let that = this;
- if (['wxOfficialAccount', 'H5'].includes(this.platform)) {
- this.$u.toast('长按图片保存');
- return false;
- }
- let authState = await new Auth('writePhotosAlbum').check();
- if (authState) {
- uni.saveImageToPhotosAlbum({
- filePath: that.posterImage,
- success: res => {
- this.$u.toast('保存成功');
- this.showPoster = false;
- },
- fail: err => {
- console.log(`图片保存失败:`, err);
- this.$u.toast('保存失败');
- }
- });
- }
- },
- // 复制链接
- copySharePath() {
- let that = this;
- uni.setClipboardData({
- data: that.shareInfo.copyLink,
- success: data => {
- that.$u.toast('已复制到剪切板');
- that.showShare = false;
- }
- });
- },
- // 获取海报格式,规则说明在@/shopro/poster/tools.js中的initDrawArray
- getPosterFormatter() {
- const that = this;
- let data = {};
- switch (this.posterType) {
- case 'user':
- data = {
- backgroundImage: that.initShare.user_poster_bg,
- drawArray: [
- {
- name: '用户昵称',
- type: 'text',
- text: that.userInfo.nickname,
- isBgCenter: true,
- size: 28,
- dy: 250,
- color: '#333',
- textAlign: 'middle',
- textBaseLine: 'middle'
- },
- {
- name: 'avatar',
- type: 'image',
- url: that.userInfo.avatar,
- alpha: 1,
- isBgCenter: true,
- dy: 95,
- dWidth: 120,
- dHeight: 120,
- circleSet: {}
- },
- // #ifdef MP-WEIXIN
- {
- name: 'wxCode',
- type: 'image',
- url: `${that.$API_URL}wechat/wxacode?scene=${that.shareInfo.query}`,
- alpha: 1,
- dy: 560,
- isBgCenter: true,
- dWidth: 180,
- dHeight: 180
- },
- // #endif
- // #ifndef MP-WEIXIN
- {
- name: '普通二维码',
- type: 'qrcode',
- text: that.shareInfo.path,
- size: 180,
- dy: 560,
- isBgCenter: true
- }
- // #endif
- ]
- };
- break;
- case 'goods':
- data = {
- backgroundImage: that.initShare.goods_poster_bg,
- drawArray: [
- {
- name: 'avatar',
- type: 'image',
- url: that.userInfo.avatar,
- alpha: 1,
- dy: 40,
- dx: 38,
- dWidth: 80,
- dHeight: 80,
- circleSet: {}
- },
- {
- type: 'text',
- text: that.userInfo.nickname,
- size: 28,
- color: '#333',
- alpha: 1,
- textAlign: 'middle',
- textBaseline: 'bottom',
- dx: 140,
- dy: 40
- },
- {
- type: 'text',
- text: '推荐一个好物给你,请查收!',
- size: 26,
- color: '#333',
- alpha: 1,
- textAlign: 'middle',
- textBaseline: 'middle',
- dx: 140,
- dy: 80
- },
- {
- name: 'goodsImage',
- type: 'image',
- url: that.posterInfo.image,
- alpha: 1,
- isBgCenter: true,
- dy: 140,
- dWidth: 620,
- dHeight: 620,
- roundRectSet: {
- r: 20
- }
- },
- {
- type: 'text', //标题
- text: that.posterInfo.title,
- size: 28,
- color: '#333',
- alpha: 1,
- textAlign: 'left',
- textBaseline: 'middle',
- fontWeight: 'bold',
- lineFeed: {
- maxWidth: 620,
- lineHeight: 40,
- lineNum: 2
- },
- dx: 36,
- dy: 780
- },
- {
- type: 'text',
- text: `¥${that.posterInfo.price}`,
- size: 38,
- color: '#E1212B',
- alpha: 1,
- textAlign: 'left',
- textBaseline: 'middle',
- fontWeight: 'bold',
- fontFamily: 'OPPOSANS',
- dx: 30,
- dy: 860
- },
- {
- type: 'text',
- text: `¥${that.posterInfo.original_price}`,
- size: 28,
- color: '#999999',
- alpha: 1,
- textAlign: 'left',
- textBaseline: 'top',
- lineThrough: {
- style: '#999999'
- },
- dx: 400,
- dy: 860
- },
- // #ifdef MP-WEIXIN
- {
- name: 'wxCode',
- type: 'image', //微信小程序码
- url: `${that.$API_URL}wechat/wxacode?scene=${that.shareInfo.query}`,
- alpha: 1,
- dx: 522,
- dy: 911,
- dWidth: 110,
- dHeight: 110
- },
- // #endif
- // #ifndef MP-WEIXIN
- {
- type: 'qrcode',
- text: that.shareInfo.copyLink,
- size: 110,
- dx: 530,
- dy: 930
- }
- // #endif
- ]
- };
- break;
- case 'groupon':
- data = {
- backgroundImage: that.initShare.groupon_poster_bg,
- drawArray: [
- {
- name: 'avatar',
- type: 'image',
- url: that.userInfo.avatar,
- alpha: 1,
- dy: 40,
- dx: 38,
- dWidth: 80,
- dHeight: 80,
- circleSet: {}
- },
- {
- type: 'text',
- text: that.userInfo.nickname,
- size: 28,
- color: '#333',
- alpha: 1,
- textAlign: 'middle',
- textBaseline: 'bottom',
- dx: 140,
- dy: 40
- },
- {
- type: 'text',
- text: '发现一个好物,快来和我一起拼吧!',
- size: 26,
- color: '#333',
- alpha: 1,
- textAlign: 'middle',
- textBaseline: 'middle',
- dx: 140,
- dy: 80
- },
- {
- name: 'goodsImage',
- type: 'image',
- url: that.posterInfo.goods.image,
- alpha: 1,
- isBgCenter: true,
- dy: 140,
- dWidth: 620,
- dHeight: 620,
- roundRectSet: {
- r: 20
- }
- },
- {
- type: 'text', //标题
- text: that.posterInfo.goods.title,
- size: 28,
- color: '#333',
- alpha: 1,
- textAlign: 'left',
- textBaseline: 'middle',
- fontWeight: 'bold',
- lineFeed: {
- maxWidth: 620,
- lineHeight: 40,
- lineNum: 2
- },
- dx: 36,
- dy: 780
- },
- {
- type: 'text',
- text: `拼团价:¥${that.posterInfo.goods.groupon_price}`,
- size: 32,
- color: '#E1212B',
- alpha: 1,
- textAlign: 'left',
- textBaseline: 'middle',
- fontWeight: 'bold',
- fontFamily: 'OPPOSANS',
- dx: 30,
- dy: 860
- },
- {
- type: 'text',
- text: `${that.posterInfo.num}人团`,
- size: 24,
- color: '#fff',
- alpha: 1,
- textAlign: 'left',
- textBaseline: 'top',
- dx: 565,
- dy: 863
- },
- // #ifdef MP-WEIXIN
- {
- name: 'wxCode',
- type: 'image', //微信小程序码
- url: `${that.$API_URL}wechat/wxacode?scene=${that.shareInfo.query}`,
- alpha: 1,
- dx: 530,
- dy: 930,
- dWidth: 110,
- dHeight: 110
- },
- // #endif
- // #ifndef MP-WEIXIN
- {
- type: 'qrcode',
- text: that.shareInfo.path,
- size: 110,
- dx: 530,
- dy: 930
- }
- // #endif
- ]
- };
- break;
- default:
- console.log('%cerr:没有此类型海报数据', 'color:green;background:yellow');
- break;
- }
- return data;
- }
- }
- };
- </script>
- <style lang="scss">
- // 指引
- .guide-wrap {
- height: 100%;
- .guide-img {
- width: 580rpx;
- height: 430rpx;
- }
- }
- // 分享海报
- .poster-btn-box {
- .cancel-btn {
- width: 300rpx;
- height: 70rpx;
- line-height: 70rpx;
- background: #ffffff;
- border-radius: 35rpx;
- font-size: 28rpx;
- font-weight: 500;
- color: #999999;
- }
- .save-btn {
- width: 300rpx;
- height: 70rpx;
- line-height: 70rpx;
- background: linear-gradient(90deg, #e9b461, #eecc89);
- border-radius: 35rpx;
- font-size: 28rpx;
- font-weight: 500;
- color: #ffffff;
- }
- }
- .poster-img-box {
- .poster-img {
- width: 660rpx;
- min-height: 800rpx;
- border-radius: 20rpx;
- }
- }
- // 分享tool
- .share-box {
- background: #fff;
- width: 750rpx;
- border-radius: 30rpx 30rpx 0 0;
- padding-top: 30rpx;
- position: relative;
- .share-foot {
- font-size: 24rpx;
- color: #bfbfbf;
- height: 80rpx;
- border-top: 1rpx solid #eee;
- }
- .share-list-box {
- .share-btn {
- background: none;
- border: none;
- line-height: 1;
- padding: 0;
- &::after {
- border: none;
- }
- }
- .share-item {
- flex: 1;
- padding-bottom: 20rpx;
- .share-img {
- width: 70rpx;
- height: 70rpx;
- background: rgba(246, 246, 254, 1);
- border-radius: 50%;
- margin-bottom: 20rpx;
- }
- .share-title {
- font-size: 24rpx;
- color: #666;
- }
- }
- }
- }
- </style>
|