diff --git a/.eslintrc.js b/.eslintrc.js index e0b044f..a2dc5d1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,6 +13,7 @@ module.exports = { "Atomics": "readonly", "SharedArrayBuffer": "readonly", "uni": true, + "wx": true, "module": true }, "parserOptions": { diff --git a/src/components/uni-popup/popup.js b/src/components/uni-popup/popup.js new file mode 100644 index 0000000..27beddf --- /dev/null +++ b/src/components/uni-popup/popup.js @@ -0,0 +1,25 @@ +// import message from './message.js' +// 定义 type 类型:弹出类型:top/bottom/center +const config = { + // 顶部弹出 + top: 'top', + // 底部弹出 + bottom: 'bottom', + // 居中弹出 + center: 'center', + // 消息提示 + message: 'top', + // 对话框 + dialog: 'center', + // 分享 + share: 'bottom', +} + +export default { + data() { + return { + config: config, + } + }, + // mixins: [message], +} diff --git a/src/components/uni-popup/uni-popup-post.vue b/src/components/uni-popup/uni-popup-post.vue new file mode 100644 index 0000000..7a8dcf5 --- /dev/null +++ b/src/components/uni-popup/uni-popup-post.vue @@ -0,0 +1,207 @@ +<template> + <view class="uni-popup-post"> + <image + class="uni_post_img" + :src="postUrl" + /> + <view + @tap="saveAndClose" + class="uni_post_button_box" + > + 保存图片 + </view> + </view> +</template> + +<script> +export default { + name: 'UniPopupPost', + props: { + postUrl: { + type: String, + default: 'https://api.glass.xiuyetang.com/adv_pic/428_0_7.png', + }, + }, + inject: ['popup'], + data() { + return {} + }, + created() { + console.log('dada', this) + }, + methods: { + // 保存图片并关闭窗口 + saveAndClose() { + // 获取用户保存相册权限 + const scope = 'scope.writePhotosAlbum' + const that = this + uni.getSetting({ + success(res) { + console.log('获取用户保存相册权限', res) + if (!res.authSetting[scope]) { + uni.authorize({ + scope, + success() { + console.log('获取用户保存相册权限---->', '授权成功') + // 保存到相册 + uni.showLoading({ + title: '保存中', + }) + that.saveImage() + }, + fail() { + console.log('获取用户保存相册权限---->', '授权失败') + that.secondGetPhoteAuthor() + }, + }) + } else { + console.log('拥有授权权限') + // 保存到相册 + uni.showLoading({ + title: '保存中', + }) + that.saveImage() + } + + that.popup.close() + }, + fail(res) { + console.log('授权失败------>', res) + uni.showToast({ + title: '保存失败', + icon: 'none', + duration: 2000, + }) + }, + }) + }, + // 保存到相册 + saveImage() { + const that = this + uni.getImageInfo({ + src: that.postUrl, + success(res) { + console.log('图片读取是否可行', res) + uni.saveImageToPhotosAlbum({ + filePath: res.path, + success() { + uni.showToast({ + title: '已保存到相册', + icon: 'none', + duration: 2000, + }) + uni.hideLoading() + }, + fail(err) { + console.log('用户拒绝', err) + if (err.errMsg === 'saveImageToPhotosAlbum:fail auth deny') { + console.log('当用户拒绝,再次发起授权') + that.secondGetPhoteAuthor() + } else if (err.errMsg === 'saveImageToPhotosAlbum:fail cancel') { + uni.showToast({ + title: '已取消保存', + icon: 'none', + duration: 2000, + }) + uni.hideLoading() + } else { + uni.showToast({ + title: '请截屏保存分享', + icon: 'none', + duration: 2000, + }) + uni.hideLoading() + } + }, + }) + }, + fail(res) { + console.log('授权失败----->', res) + uni.hideLoading() + uni.showToast({ + title: '保存失败', + icon: 'none', + duration: 2000, + }) + }, + }) + }, + // 二次请求授权 + secondGetPhoteAuthor() { + const that = this + uni.showModal({ + title: '保存海报', + content: '需要您提供保存相册权限', + success: (res) => { + if (res.confirm) { + uni.openSetting({ + success(settingdata) { + console.log('settingdata 二次弹窗获取', settingdata) + if (settingdata.authSetting['scope.writePhotosAlbum']) { + console.log('二次弹窗获取---->', '获取 相册 权限成功,给出再次点击图片保存到相册的提示。') + uni.showLoading({ + title: '保存中', + }) + that.saveImage() + } else { + uni.showToast({ + title: '保存失败', + icon: 'none', + duration: 2000, + }) + console.log('二次弹窗获取', '获取 相册 权限失败,给出不给权限就无法正常使用的提示') + } + }, + }) + } else { + uni.showToast({ + title: '保存失败', + icon: 'none', + duration: 2000, + }) + } + }, + fail(err) { + uni.showToast({ + title: '保存失败', + icon: 'none', + duration: 2000, + }) + console.log('再次失败', err) + }, + }) + }, + }, +} +</script> +<style lang="scss" scoped> +.uni-popup-post { + border-radius: 8px 8px 0px 0px; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; +} + +.uni_post_img { + width: 690rpx; + height: 466.667px; + margin-top: -180rpx; +} + +.uni_post_button_box { + height: 112rpx; + line-height: 112rpx; + background-color: #ff6b4a; + border-radius: 4px; + width: 350px; + color: #fff; + text-align: center; + margin-top: 44rpx; + font-family: PingFangSC-Medium; + font-size: 14px; + color: #ffffff; + letter-spacing: -0.26px; + text-align: center; +} +</style> diff --git a/src/components/uni-popup/uni-popup-share.vue b/src/components/uni-popup/uni-popup-share.vue new file mode 100644 index 0000000..200d5b2 --- /dev/null +++ b/src/components/uni-popup/uni-popup-share.vue @@ -0,0 +1,185 @@ +<template> + <view class="uni-popup-share"> + <!-- <view class="uni-share-title"><text class="uni-share-title-text">{{title}}</text></view> --> + <view class="uni-share-content"> + <view class="uni-share-content-box"> + <button + class="uni-share-content-item" + v-for="(item,index) in bottomData" + :key="index" + :open-type="item.name === 'friend' ? 'share': ''" + @click.stop="select(item,index)" + > + <image + class="uni-share-image" + :src="item.icon" + mode="aspectFill" + ></image> + <view class="uni-share-text">{{item.text}}</view> + </button> + </view> + </view> + <view + @tap="close" + class="uni-share-button-box" + > + 取消 + </view> + </view> +</template> + +<script> +export default { + name: 'UniPopupShare', + props: { + title: { + type: String, + default: '分享到', + }, + }, + inject: ['popup'], + data() { + return { + bottomData: [{ + text: '推荐到好物圈', + icon: '/static/img/share/recommend.png', + name: 'recommend', + }, { + text: '转发给朋友/群', + icon: '/static/img/share/friend.png', + name: 'friend', + }, { + text: '生成海报', + icon: '/static/img/share/poster.png', + name: 'poster', + }, + ], + } + }, + created() {}, + methods: { + /** + * 选择内容 + */ + select(item, index) { + this.$emit('select', { + item, + index, + }, () => { + this.popup.close() + }) + }, + /** + * 关闭窗口 + */ + close() { + this.popup.close() + }, + }, +} +</script> +<style lang="scss" scoped> +.uni-popup-share { + background-color: #fff; + border-radius: 8px 8px 0px 0px; +} +.uni-share-title { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + align-items: center; + justify-content: center; + height: 40px; +} +.uni-share-title-text { + font-size: 14px; + color: #666; +} +.uni-share-content { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + justify-content: center; + padding-top: 10px; +} + +.uni-share-content-box { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + + flex-direction: column; + justify-content: space-between; + width: 360px; +} + +.uni-share-content-item { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + flex-wrap: wrap; + padding: 10px 0; + align-items: center; + border-bottom: 1px solid #f2f2f2; + + background-color: #fff; + font-family: PingFangSC-Regular; + font-size: 16px; + color: #333333; + letter-spacing: -0.3px; + margin: 0; + &::after { + border: 0; + } +} + +.uni-share-content-item:active { + background-color: #f5f5f5; +} + +.uni-share-image { + width: 84rpx; + height: 84rpx; + vertical-align: middle; + margin-left: 40rpx; +} + +.uni-share-text { + font-family: PingFangSC-Regular; + font-size: 16px; + color: #3b4144; + margin-left: 20rpx; +} +// .share_button { +// border: none; +// } + +.uni-share-button-box { + /* #ifndef APP-NVUE */ + // display: flex; + /* #endif */ + // flex-direction: row; + // padding: 10px 15px; + height: 100rpx; + font-family: PingFangSC-Regular; + font-size: 16px; + color: #333333; + letter-spacing: -0.3px; + text-align: center; + line-height: 100rpx; +} + +.uni-share-button { + flex: 1; + border-radius: 50px; + color: #666; + font-size: 16px; +} + +.uni-share-button::after { + border-radius: 50px; +} +</style> diff --git a/src/components/uni-popup/uni-popup.vue b/src/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..508fd04 --- /dev/null +++ b/src/components/uni-popup/uni-popup.vue @@ -0,0 +1,313 @@ +<template> + <view + v-if="showPopup" + class="uni-popup" + :class="[popupstyle]" + @touchmove.stop.prevent="clear" + > + <uni-transition + v-if="maskShow" + :mode-class="['fade']" + :styles="maskClass" + :duration="duration" + :show="showTrans" + @click="onTap" + /> + <uni-transition + :mode-class="ani" + :styles="transClass" + :duration="duration" + :show="showTrans" + @click="onTap" + > + <view + class="uni-popup__wrapper-box" + @click.stop="clear" + > + <slot /> + </view> + </uni-transition> + </view> +</template> + +<script> +import uniTransition from '../uni-transition/uni-transition.vue' +import popup from './popup.js' +/** + * PopUp 弹出层 + * @description 弹出层组件,为了解决遮罩弹层的问题 + * @tutorial https://ext.dcloud.net.cn/plugin?id=329 + * @property {String} type = [top|center|bottom] 弹出方式 + * @value top 顶部弹出 + * @value center 中间弹出 + * @value bottom 底部弹出 + * @value message 消息提示 + * @value dialog 对话框 + * @value share 底部分享示例 + * @property {Boolean} animation = [ture|false] 是否开启动画 + * @property {Boolean} maskClick = [ture|false] 蒙版点击是否关闭弹窗 + * @event {Function} change 打开关闭弹窗触发,e={show: false} + */ + +export default { + name: 'UniPopup', + components: { + uniTransition, + }, + props: { + // 开启动画 + animation: { + type: Boolean, + default: true, + }, + // 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层 + // message: 消息提示 ; dialog : 对话框 + type: { + type: String, + default: 'center', + }, + // maskClick + maskClick: { + type: Boolean, + default: true, + }, + }, + provide() { + return { + popup: this, + } + }, + mixins: [popup], + watch: { + /** + * 监听type类型 + */ + type: { + handler: function(newVal) { + this[this.config[newVal]]() + }, + immediate: true, + }, + /** + * 监听遮罩是否可点击 + * @param {Object} val + */ + maskClick(val) { + this.mkclick = val + }, + }, + data() { + return { + duration: 300, + ani: [], + showPopup: false, + showTrans: false, + maskClass: { + position: 'fixed', + bottom: 0, + top: 0, + left: 0, + right: 0, + backgroundColor: 'rgba(0, 0, 0, 0.4)', + }, + transClass: { + position: 'fixed', + left: 0, + right: 0, + }, + maskShow: true, + mkclick: true, + popupstyle: 'top', + } + }, + created() { + this.mkclick = this.maskClick + if (this.animation) { + this.duration = 300 + } else { + this.duration = 0 + } + }, + methods: { + clear(e) { + // TODO nvue 取消冒泡 + e.stopPropagation() + }, + open() { + this.showPopup = true + this.$nextTick(() => { + new Promise(resolve => { + clearTimeout(this.timer) + this.timer = setTimeout(() => { + this.showTrans = true + // fixed by mehaotian 兼容 app 端 + this.$nextTick(() => { + resolve() + }) + }, 50) + }).then(res => { + // 自定义打开事件 + clearTimeout(this.msgtimer) + this.msgtimer = setTimeout(() => { + this.customOpen && this.customOpen() + }, 100) + this.$emit('change', { + show: true, + type: this.type, + }) + }) + }) + }, + close(type) { + this.showTrans = false + this.$nextTick(() => { + this.$emit('change', { + show: false, + type: this.type, + }) + clearTimeout(this.timer) + // 自定义关闭事件 + this.customOpen && this.customClose() + this.timer = setTimeout(() => { + this.showPopup = false + }, 300) + }) + }, + onTap() { + if (!this.mkclick) return + this.close() + }, + /** + * 顶部弹出样式处理 + */ + top() { + this.popupstyle = 'top' + this.ani = ['slide-top'] + this.transClass = { + position: 'fixed', + left: 0, + right: 0, + } + }, + /** + * 底部弹出样式处理 + */ + bottom() { + this.popupstyle = 'bottom' + this.ani = ['slide-bottom'] + this.transClass = { + position: 'fixed', + left: 0, + right: 0, + bottom: 0, + } + }, + /** + * 中间弹出样式处理 + */ + center() { + this.popupstyle = 'center' + this.ani = ['zoom-out', 'fade'] + this.transClass = { + position: 'fixed', + /* #ifndef APP-NVUE */ + display: 'flex', + flexDirection: 'column', + /* #endif */ + bottom: 0, + left: 0, + right: 0, + top: 0, + justifyContent: 'center', + alignItems: 'center', + } + }, + }, +} +</script> +<style lang="scss" scoped> +.uni-popup { + position: fixed; + /* #ifndef APP-NVUE */ + z-index: 99; + /* #endif */ +} + +.uni-popup__mask { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: $uni-bg-color-mask; + opacity: 0; +} + +.mask-ani { + transition-property: opacity; + transition-duration: 0.2s; +} + +.uni-top-mask { + opacity: 1; +} + +.uni-bottom-mask { + opacity: 1; +} + +.uni-center-mask { + opacity: 1; +} + +.uni-popup__wrapper { + /* #ifndef APP-NVUE */ + display: block; + /* #endif */ + position: absolute; +} + +.top { + /* #ifdef H5 */ + top: var(--window-top); + /* #endif */ + /* #ifndef H5 */ + top: 0; + /* #endif */ +} + +.bottom { + bottom: 0; +} + +.uni-popup__wrapper-box { + /* #ifndef APP-NVUE */ + display: block; + /* #endif */ + position: relative; + /* iphonex 等安全区设置,底部安全区适配 */ + /* #ifndef APP-NVUE */ + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + /* #endif */ +} + +.content-ani { + // transition: transform 0.3s; + transition-property: transform, opacity; + transition-duration: 0.2s; +} + +.uni-top-content { + transform: translateY(0); +} + +.uni-bottom-content { + transform: translateY(0); +} + +.uni-center-content { + transform: scale(1); + opacity: 1; +} +</style> diff --git a/src/pages/details/components/Introduce.vue b/src/pages/details/components/Introduce.vue index 6529807..d99ef9c 100644 --- a/src/pages/details/components/Introduce.vue +++ b/src/pages/details/components/Introduce.vue @@ -120,12 +120,8 @@ export default { tag: Object, }, created() { - console.log('lalal') - console.log('tag', this) }, updated() { - console.log('lalal-2') - console.log('tag-2', this.tag) }, } </script> diff --git a/src/pages/details/details.vue b/src/pages/details/details.vue index 726f27f..c983aff 100644 --- a/src/pages/details/details.vue +++ b/src/pages/details/details.vue @@ -31,7 +31,10 @@ <!-- 产品名称 --> <view class="info_name"> <text class="info_name_name">{{goodsInfo.name || '暂无'}}</text> - <view class="info_name_share"> + <view + @tap="confirmShare" + class="info_name_share" + > <image src="/static/img/detail/share-icon.png"></image> <text>分享</text> </view> @@ -164,19 +167,51 @@ >立即购买</view> </view> </view> + <!-- 参数选择 --> + <!-- <BottomSheet + :isCart="isCart" + @addCart="addCart" + :pid="pid" + :goodInfo="goodInfo" + :isShowBottom="isShowBottom" + @closeBottom="closeBottom" + ></BottomSheet> --> + <!-- 分享 --> + <template> + <uni-popup + ref="popupShare" + type="share" + > + <uni-popup-share @select="selectShare"></uni-popup-share> + </uni-popup> + </template> + <!-- 分享海报 --> + <template> + <uni-popup + ref="uniPopupPost" + type="center" + > + <uni-popup-post :postUrl="postUrl"></uni-popup-post> + </uni-popup> + </template> </view> </template> <script> import store from '@/store' -import Introduce from './components/Introduce' // 商品介绍基本信息 +import Introduce from './components/Introduce' // 商品介绍基本信息组件 import AfterSails from './components/AfterSails' // 售后保障组件 -// import BottomSheet from '@/components/BottomSheet.vue' +import uniPopupShare from '@/components/uni-popup/uni-popup-share.vue' // 分享组件 +import uniPopupPost from '@/components/uni-popup/uni-popup-post.vue' // 分享组件 +// import BottomSheet from '@/components/BottomSheet/BottomSheet.vue' // 参数选择组件 export default { components: { Introduce, AfterSails, + // BottomSheet, + uniPopupShare, + uniPopupPost, }, data () { return { @@ -189,6 +224,7 @@ export default { '规格参数', '售后保障', ], + showPostImg: false, // 是否展示分享海报 } }, onLoad({ pid = this.pid, sk_id: skId }) { @@ -230,6 +266,14 @@ export default { cartNumber() { return this.$store.state.details.cartNumber }, + // 购物车数目 + skuList() { + return this.$store.state.details.skuList + }, + // 分享海报 + postUrl() { + return this.$store.state.details.postUrl + }, }, methods: { // 获取产品详情 @@ -249,6 +293,103 @@ export default { this.item_current = e } }, + // 打开分享界面 + confirmShare() { + this.$refs.popupShare.open() + }, + // 选择分享 + selectShare(e, done) { + switch (e.item.name) { + // 分享到好物圈 + case 'recommend': + this.shareRecommend() + break + // 分享到朋友圈 + case 'friend': + break + // 生成海报 + case 'poster': + uni.showLoading({ + title: '生成图片中', + }) + this.sharePost() + break + default: + break + } + done() + }, + // 分享到好物圈 + shareRecommend() { + if (wx.openBusinessView) { + wx.openBusinessView({ + businessType: 'friendGoodsRecommend', + extraData: { + product: { + item_code: '58_68', + title: this.goodsInfo.name, + image_list: this.carousel, + }, + }, + success: function (res) { + uni.showToast({ + title: '好物圈分享成功!', + icon: 'none', + duration: 2000, + }) + // 向服务器报告这个事情 + // TODO:::记录这个用户的推广过程。 + console.log('好物圈分享成功!', res) + }, + fail: function (res) { + console.log('好物圈分享失败!', res) + }, + }) + } + }, + // 分享到朋友/圈 + shareFriend() { + this.onShareAppMessage() + }, + // 朋友圈设置页面 + onShareAppMessage() { + let myName = this.$store.state.user.userInfo.nickName + if (myName === '' || myName.length < 1 || myName === '匿名用户' || typeof myName === 'undefined') { + myName = '【神秘人】' + } else { + myName = '【' + myName + '】' + } + const uid = uni.getStorageSync('uid') + return { + title: 'Hi,' + myName + '送你300元来试戴最新潮流眼镜!', // 默认是小程序的名称(可以写slogan等) + path: '/pages/index/detail/index?uid=' + uid + '&sid=0&pid=' + this.pid, + imageUrl: this.skuList[0].pic, // 不传入 imageUrl 则使用默认截图。显示图片长宽比是 5:4 + success: function (res) { + if (res.errMsg === 'shareAppMessage:ok') { + console.log('分享成功!', res) + } + }, + fail: function (res) { + if (res.errMsg === 'shareAppMessage:fail cancel') { + console.log('fail', '放弃分享') + } else if (res.errMsg === 'shareAppMessage:fail') { + console.log('fail', '分享失败') + } + }, + } + }, + // 生成海报 + sharePost() { + const fromsid = this.$store.state.user.fromInfo.fromsid || 'undefined' + + store.dispatch('details/post', { + pid: this.pid, + sid: fromsid === 'undefined' ? 0 : fromsid, + }).then((data) => { + uni.hideLoading() + this.$refs.uniPopupPost.open() + }) + }, }, } </script> @@ -293,6 +434,7 @@ export default { .info_pay_number { color: #999; font-size: 14px; + font-family: PingFangSC-Regular; } } // 产品名称 @@ -459,6 +601,10 @@ export default { justify-content: space-between; align-content: center; margin: 0; + /* iphonex 等安全区设置,底部安全区适配 */ + /* #ifndef APP-NVUE */ + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); .menu_1 { width: 20%; height: 100%; diff --git a/src/static/img/share/friend.png b/src/static/img/share/friend.png new file mode 100644 index 0000000000000000000000000000000000000000..ed64045fd46f9379e3b15109ab59e2a4c0460087 GIT binary patch literal 6558 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 QJpcdz07*qoM6N<$g7H8m3IG5A literal 0 HcmV?d00001 diff --git a/src/static/img/share/poster.png b/src/static/img/share/poster.png new file mode 100644 index 0000000000000000000000000000000000000000..481792c91c10a166fa2acc40fd5fdd5cb0dabb03 GIT binary patch literal 7082 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 UAn?h$&j0`b07*qoM6N<$f^2r8SpWb4 literal 0 HcmV?d00001 diff --git a/src/static/img/share/recommend.png b/src/static/img/share/recommend.png new file mode 100644 index 0000000000000000000000000000000000000000..ac38dfa84588dae2676188de9620c42763cea68b GIT binary patch literal 7558 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 literal 0 HcmV?d00001 diff --git a/src/store/modules/details.js b/src/store/modules/details.js index 46d0d18..4b250d8 100644 --- a/src/store/modules/details.js +++ b/src/store/modules/details.js @@ -4,6 +4,7 @@ import request from '../request' const { read, cartList, + makePost, } = urlAlias const state = { @@ -44,20 +45,27 @@ const state = { more: '', // 购物车数目 cartNumber: 0, + // skuList + skuList: [], + postUrl: 'https://api.glass.xiuyetang.com/adv_pic/428_0_7.png', } const mutations = { - INIT: (state, { carousel, goodsInfo, tag, specification, evaluate, more }) => { + INIT: (state, { carousel, goodsInfo, tag, specification, evaluate, more, skuList }) => { state.carousel = carousel state.goodsInfo = goodsInfo state.tag = tag state.specification = specification state.evaluate = evaluate state.more = more + state.skuList = skuList }, CART: (state, number) => { state.cartNumber = number }, + POST: (state, url) => { + state.postUrl = url + }, } const actions = { @@ -87,6 +95,7 @@ const actions = { } commit('INIT', { + skuList: data.skuList, carousel: data.pics, goodsInfo: { name: data.p_name, @@ -101,6 +110,7 @@ const actions = { tag: data.judge_tag, star: parseInt(5 * Number(data.judgeInfo.good.slice(0, -1)) / 100), }, + // eslint-disable-next-line more: data.prodIntro1.replace(/\<img/gi, '<img style="max-width:100%;height:auto"'), }) resolve(data) @@ -116,7 +126,6 @@ const actions = { url: cartList, data: param, success: ({ data: { data } }) => { - console.log('cartData', data) let number = 0 for (let index = 0; index < data.length; index++) { number += Number(data[index].num) @@ -125,6 +134,17 @@ const actions = { }, })) }, + // 生成分享海报 + post({ commit }, param) { + return new Promise((resolve) => request({ + url: makePost, + data: param, + success: ({ data }) => { + commit('POST', data.data) + resolve() + }, + })) + }, } export default { diff --git a/src/store/url.js b/src/store/url.js index 7a4c687..bb52b32 100644 --- a/src/store/url.js +++ b/src/store/url.js @@ -35,6 +35,7 @@ const urlAlias = { detailStandardList: '/app/prod/read', // 获取商品的详细信息 // 选购页 detailStandardUrl: '/app/prod/read', // 获取商品的详细信息 + makePost: '/app/glass/makeProdAdvPic', // 生成分享海报 // 地址管理 editAddress: '/app/address/edit_address', // 编辑地址