Browse Source

修改个人中心,购物车空白区域的问题

zyh
Gao xiaosong 4 years ago
parent
commit
1afb0ce5f8
  1. 2
      config/index.js
  2. 3
      pages/home/index.vue
  3. 735
      pages/shop/ShoppingCart/index.vue
  4. 4
      pages/user/User/index.vue
  5. 6
      剩余问题.js

2
config/index.js

@ -2,6 +2,6 @@
// export const VUE_APP_API_URL = 'http://natapp.xinxintuan.co/api'; // export const VUE_APP_API_URL = 'http://natapp.xinxintuan.co/api';
// export const VUE_APP_API_URL = 'https://wxapi.yixiang.co/api'; // export const VUE_APP_API_URL = 'https://wxapi.yixiang.co/api';
// export const VUE_APP_API_URL = 'http://192.168.31.223:8008/api'; // export const VUE_APP_API_URL = 'http://192.168.31.223:8008/api';
export const VUE_APP_API_URL = 'http://h5api.xinxintuan.co/api'; export const VUE_APP_API_URL = 'https://h5api.xinxintuan.co/api';
export const VUE_APP_RESOURCES_URL = 'https://wx.yixiang.co/static'; export const VUE_APP_RESOURCES_URL = 'https://wx.yixiang.co/static';

3
pages/home/index.vue

@ -21,9 +21,6 @@
<view class="qr" @click="startQr()"> <view class="qr" @click="startQr()">
<image src="@/static/images/qr.png" /> <image src="@/static/images/qr.png" />
</view> </view>
<view class="qr" @click="$yrouter.push({path:'/pages/shop/GoodsEvaluate/index'})">
<image src="@/static/images/qr.png" />
</view>
</view> </view>
<Banner :banner="banner" @getbgcolor="getbgcolor"></Banner> <Banner :banner="banner" @getbgcolor="getbgcolor"></Banner>
<uni-notice-bar scrollable="true" @click="goRoll(singNew)" single="true" :speed="10" showIcon="true" <uni-notice-bar scrollable="true" @click="goRoll(singNew)" single="true" :speed="10" showIcon="true"

735
pages/shop/ShoppingCart/index.vue

@ -17,19 +17,13 @@
购物数量 购物数量
<text class="num font-color-red">{{ count }}</text> <text class="num font-color-red">{{ count }}</text>
</view> </view>
<view <view v-if="cartList.valid.length > 0" class="administrate acea-row row-center-wrapper" @click="manage">
v-if="cartList.valid.length > 0" {{ footerswitch ? '取消' : '管理' }}</view>
class="administrate acea-row row-center-wrapper"
@click="manage"
>{{ footerswitch ? '取消' : '管理' }}</view>
</view> </view>
<view v-if="validList.length > 0 || cartList.invalid.length > 0"> <view v-if="validList.length > 0 || cartList.invalid.length > 0">
<view class="list"> <view class="list">
<view <view class="item acea-row row-between-wrapper" v-for="(item, cartListValidIndex) in validList"
class="item acea-row row-between-wrapper" :key="cartListValidIndex">
v-for="(item, cartListValidIndex) in validList"
:key="cartListValidIndex"
>
<view class="select-btn"> <view class="select-btn">
<view class="checkbox-wrapper"> <view class="checkbox-wrapper">
<checkbox-group @change="switchSelect(cartListValidIndex)"> <checkbox-group @change="switchSelect(cartListValidIndex)">
@ -46,31 +40,19 @@
</view> </view>
<view class="text"> <view class="text">
<view class="line1">{{ item.productInfo.storeName }}</view> <view class="line1">{{ item.productInfo.storeName }}</view>
<view <view class="infor line1" v-if="item.productInfo.attrInfo">属性{{ item.productInfo.attrInfo.sku }}</view>
class="infor line1"
v-if="item.productInfo.attrInfo"
>属性{{ item.productInfo.attrInfo.sku }}</view>
<view class="money">{{ item.truePrice }}</view> <view class="money">{{ item.truePrice }}</view>
</view> </view>
<view class="carnum acea-row row-center-wrapper"> <view class="carnum acea-row row-center-wrapper">
<view <view class="reduce" :class="validList[cartListValidIndex].cartNum <= 1 ? 'on' : ''"
class="reduce" @click.prevent="reduce(cartListValidIndex)">-</view>
:class="validList[cartListValidIndex].cartNum <= 1 ? 'on' : ''"
@click.prevent="reduce(cartListValidIndex)"
>-</view>
<view class="num">{{ item.cartNum }}</view> <view class="num">{{ item.cartNum }}</view>
<view <view class="plus" v-if="validList[cartListValidIndex].attrInfo"
class="plus"
v-if="validList[cartListValidIndex].attrInfo"
:class="validList[cartListValidIndex].cartNum >= validList[cartListValidIndex].attrInfo.stock ? 'on' : ''" :class="validList[cartListValidIndex].cartNum >= validList[cartListValidIndex].attrInfo.stock ? 'on' : ''"
@click.prevent="plus(cartListValidIndex)" @click.prevent="plus(cartListValidIndex)">+</view>
>+</view> <view class="plus" v-else
<view
class="plus"
v-else
:class="validList[cartListValidIndex].cartNum >= validList[cartListValidIndex].stock ? 'on' : ''" :class="validList[cartListValidIndex].cartNum >= validList[cartListValidIndex].stock ? 'on' : ''"
@click.prevent="plus(cartListValidIndex)" @click.prevent="plus(cartListValidIndex)">+</view>
>+</view>
</view> </view>
</view> </view>
</view> </view>
@ -78,25 +60,15 @@
<view class="invalidGoods" v-if="cartList.invalid.length > 0"> <view class="invalidGoods" v-if="cartList.invalid.length > 0">
<view class="goodsNav acea-row row-between-wrapper"> <view class="goodsNav acea-row row-between-wrapper">
<view @click="goodsOpen"> <view @click="goodsOpen">
<text <text class="iconfont" :class="goodsHidden === true ? 'icon-xiangyou' : 'icon-xiangxia'"></text>失效商品
class="iconfont"
:class="goodsHidden === true ? 'icon-xiangyou' : 'icon-xiangxia'"
></text>失效商品
</view> </view>
<view class="del" @click="delInvalidGoods"> <view class="del" @click="delInvalidGoods">
<text class="iconfont icon-shanchu1"></text>清空 <text class="iconfont icon-shanchu1"></text>清空
</view> </view>
</view> </view>
<view class="goodsList" :hidden="goodsHidden"> <view class="goodsList" :hidden="goodsHidden">
<view <view v-for="(item, cartListinvalidIndex) in cartList.invalid" :key="cartListinvalidIndex">
v-for="(item, cartListinvalidIndex) in cartList.invalid" <view @click="goGoodsCon(item)" class="item acea-row row-between-wrapper" v-if="item.productInfo">
:key="cartListinvalidIndex"
>
<view
@click="goGoodsCon(item)"
class="item acea-row row-between-wrapper"
v-if="item.productInfo"
>
<view class="invalid acea-row row-center-wrapper">失效</view> <view class="invalid acea-row row-center-wrapper">失效</view>
<view class="pictrue"> <view class="pictrue">
<image :src="item.productInfo.attrInfo.image" v-if="item.productInfo.attrInfo" /> <image :src="item.productInfo.attrInfo.image" v-if="item.productInfo.attrInfo" />
@ -104,10 +76,8 @@
</view> </view>
<view class="text acea-row row-column-between"> <view class="text acea-row row-column-between">
<view class="line1">{{ item.productInfo.storeName }}</view> <view class="line1">{{ item.productInfo.storeName }}</view>
<view <view class="infor line1" v-if="item.productInfo.attrInfo">属性{{ item.productInfo.attrInfo.sku }}
class="infor line1" </view>
v-if="item.productInfo.attrInfo"
>属性{{ item.productInfo.attrInfo.sku }}</view>
<view class="acea-row row-between-wrapper"> <view class="acea-row row-between-wrapper">
<view class="end">该商品已下架</view> <view class="end">该商品已下架</view>
</view> </view>
@ -160,77 +130,96 @@
</view> </view>
</view> </view>
</view> </view>
<Authorization v-if="!$store.getters.token" /> <Authorization v-else />
</view> </view>
</template> </template>
<script> <script>
import Recommend from "@/components/Recommend"; import Recommend from "@/components/Recommend";
import Authorization from "@/pages/authorization/index"; import Authorization from "@/pages/authorization/index";
import { mapGetters } from "vuex"; import {
mapGetters
} from "vuex";
import { import {
getCartList, getCartList,
postCartDel, postCartDel,
changeCartNum, changeCartNum,
getCartCount getCartCount
} from "@/api/store"; } from "@/api/store";
import { postCollectAll } from "@/api/user"; import {
import { mul, add } from "@/utils/bc"; postCollectAll
import cookie from "@/utils/store/cookie"; } from "@/api/user";
import {
mul,
add
} from "@/utils/bc";
import cookie from "@/utils/store/cookie";
const CHECKED_IDS = "cart_checked"; const CHECKED_IDS = "cart_checked";
export default { export default {
name: "ShoppingCart", name: "ShoppingCart",
components: { components: {
Recommend, Recommend,
Authorization Authorization
}, },
props: {}, props: {},
data: function() { data: function () {
return { return {
cartList: { cartList: {
invalid: [], invalid: [],
valid: [] valid: []
}, },
validList: [], validList: [],
isAllSelect: false, isAllSelect: false,
cartCount: 0, cartCount: 0,
countmoney: 0, countmoney: 0,
goodsHidden: true, goodsHidden: true,
footerswitch: false, footerswitch: false,
count: 0, count: 0,
checkedIds: [], checkedIds: [],
loaded: false loaded: false
}; };
}, },
computed: mapGetters(["userInfo", "token"]), computed: mapGetters(["userInfo", "token"]),
// watch: { // watch: {
// $yroute(n) { // $yroute(n) {
// if (n.name === "ShoppingCart") { // if (n.name === "ShoppingCart") {
// this.carnum(); // this.carnum();
// this.countMoney(); // this.countMoney();
// this.getCartList(); // this.getCartList();
// this.gainCount(); // this.gainCount();
// this.goodsHidden = true; // this.goodsHidden = true;
// this.footerswitch = false; // this.footerswitch = false;
// } // }
// }, // },
// cartList(list) { // cartList(list) {
// this.validList = list.valid; // this.validList = list.valid;
// } // }
// }, // },
watch: { watch: {
userInfo(user) { userInfo(user) {
if (user.uid) { if (user.uid) {
this.carnum(); this.carnum();
this.countMoney(); this.countMoney();
this.getCartList(); this.getCartList();
this.gainCount(); this.gainCount();
}
},
token(token) {
if (this.userInfo.uid) {
this.carnum();
this.countMoney();
this.getCartList();
this.gainCount();
}
},
cartList(list) {
this.validList = list.valid;
} }
}, },
token(token) { onShow: function () {
if (this.userInfo.uid) { if (this.userInfo.uid) {
this.carnum(); this.carnum();
this.countMoney(); this.countMoney();
@ -238,297 +227,285 @@ export default {
this.gainCount(); this.gainCount();
} }
}, },
cartList(list) { methods: {
this.validList = list.valid; goGoodsCon(item) {
} this.$yrouter.push({
}, path: "/pages/shop/GoodsCon/index",
onShow: function() { query: {
if (this.userInfo.uid) { id: item.productId
this.carnum(); }
this.countMoney(); });
this.getCartList(); },
this.gainCount(); getCartList: function () {
} let that = this;
}, getCartList().then(res => {
methods: { that.cartList = res.data;
goGoodsCon(item) { let checkedIds = cookie.get(CHECKED_IDS) || [];
this.$yrouter.push({ if (!Array.isArray(checkedIds)) checkedIds = [];
path: "/pages/shop/GoodsCon/index", this.cartList.valid.forEach(cart => {
query: { if (checkedIds.indexOf(cart.id) !== -1) cart.checked = true;
id: item.productId });
} if (checkedIds.length) {
}); that.checkedIds = checkedIds;
}, that.isAllSelect = checkedIds.length === this.cartList.valid.length;
getCartList: function() { that.carnum();
let that = this; that.countMoney();
getCartList().then(res => { }
that.cartList = res.data; this.loaded = true;
let checkedIds = cookie.get(CHECKED_IDS) || []; });
if (!Array.isArray(checkedIds)) checkedIds = []; },
this.cartList.valid.forEach(cart => { //
if (checkedIds.indexOf(cart.id) !== -1) cart.checked = true; delgoods: function () {
let that = this,
id = [],
valid = [],
list = that.cartList.valid;
list.forEach(function (val) {
if (val.checked === true) {
id.push(val.id);
}
}); });
if (checkedIds.length) { if (id.length === 0) {
that.checkedIds = checkedIds; uni.showToast({
that.isAllSelect = checkedIds.length === this.cartList.valid.length; title: "请选择产品",
icon: "none",
duration: 2000
});
return;
}
postCartDel(id).then(function () {
list.forEach(function (val, i) {
if (val.checked === false || val.checked === undefined)
valid.push(list[i]);
});
that.$set(that.cartList, "valid", valid);
that.carnum(); that.carnum();
that.countMoney(); that.countMoney();
} that.gainCount();
this.loaded = true; that.getCartList();
}); });
}, },
// // //
delgoods: function() { gainCount: function () {
let that = this, let that = this;
id = [], getCartCount().then(res => {
valid = [], that.count = res.data.count;
list = that.cartList.valid; });
list.forEach(function(val) { },
if (val.checked === true) { //
delInvalidGoods: function () {
let that = this,
id = [],
list = that.cartList.invalid;
list.forEach(function (val) {
id.push(val.id); id.push(val.id);
}
});
if (id.length === 0) {
uni.showToast({
title: "请选择产品",
icon: "none",
duration: 2000
}); });
return; postCartDel(id).then(function () {
} list.splice(0, list.length);
postCartDel(id).then(function() { that.gainCount();
list.forEach(function(val, i) { that.getCartList();
if (val.checked === false || val.checked === undefined)
valid.push(list[i]);
}); });
that.$set(that.cartList, "valid", valid); },
that.carnum(); //;
that.countMoney(); collectAll: function () {
that.gainCount(); let that = this,
that.getCartList(); data = {
}); id: [],
}, category: ""
// // },
gainCount: function() { list = that.cartList.valid;
let that = this; list.forEach(function (val) {
getCartCount().then(res => { if (val.checked === true) {
that.count = res.data.count; data.id.push(val.product_id);
}); data.category = val.type;
}, }
// });
delInvalidGoods: function() { if (data.id.length === 0) {
let that = this, uni.showToast({
id = [], title: "请选择产品",
list = that.cartList.invalid; icon: "none",
list.forEach(function(val) { duration: 2000
id.push(val.id); });
}); return;
postCartDel(id).then(function() {
list.splice(0, list.length);
that.gainCount();
that.getCartList();
});
},
//;
collectAll: function() {
let that = this,
data = {
id: [],
category: ""
},
list = that.cartList.valid;
list.forEach(function(val) {
if (val.checked === true) {
data.id.push(val.product_id);
data.category = val.type;
} }
}); postCollectAll(data).then(function () {
if (data.id.length === 0) { uni.showToast({
uni.showToast({ title: "收藏成功!",
title: "请选择产品", icon: "none",
icon: "none", duration: 2000
duration: 2000 });
}); });
return; },
} //
postCollectAll(data).then(function() { placeOrder: function () {
uni.showToast({ let that = this,
title: "收藏成功!", list = that.cartList.valid,
icon: "none", id = [];
duration: 2000 list.forEach(function (val) {
if (val.checked === true) {
id.push(val.id);
}
}); });
}); if (id.length === 0) {
}, uni.showToast({
// title: "请选择产品",
placeOrder: function() { icon: "none",
let that = this, duration: 2000
list = that.cartList.valid, });
id = []; return;
list.forEach(function(val) {
if (val.checked === true) {
id.push(val.id);
} }
}); this.$yrouter.push({
if (id.length === 0) { path: "/pages/order/OrderSubmission/index",
uni.showToast({ query: {
title: "请选择产品", id: id.join(",")
icon: "none", }
duration: 2000
}); });
return; },
} manage: function () {
this.$yrouter.push({ let that = this;
path: "/pages/order/OrderSubmission/index", that.footerswitch = !that.footerswitch;
query: { },
id: id.join(",") goodsOpen: function () {
let that = this;
that.goodsHidden = !that.goodsHidden;
},
//
plus: function (index) {
let that = this;
let list = that.cartList.valid[index];
list.cartNum++;
if (list.attrInfo) {
if (list.cartNum >= list.attrInfo.stock) {
that.$set(list, "cart_num", list.attrInfo.stock);
}
} else {
if (list.cartNum >= list.stock) {
that.$set(list, "cart_num", list.stock);
}
} }
}); that.carnum();
}, that.countMoney();
manage: function() { that.syncCartNum(list);
let that = this; },
that.footerswitch = !that.footerswitch; //
}, reduce: function (index) {
goodsOpen: function() { let that = this;
let that = this; let list = that.cartList.valid[index];
that.goodsHidden = !that.goodsHidden; if (list.cartNum <= 1) {
}, uni.showToast({
// title: "已经是底线啦!",
plus: function(index) { icon: "none",
let that = this; duration: 2000
let list = that.cartList.valid[index]; });
list.cartNum++; return;
if (list.attrInfo) {
if (list.cartNum >= list.attrInfo.stock) {
that.$set(list, "cart_num", list.attrInfo.stock);
} }
} else { list.cartNum--;
if (list.cartNum >= list.stock) { if (list.cartNum < 1) {
that.$set(list, "cart_num", list.stock); that.$set(list, "cart_num", 1);
} }
} that.carnum();
that.carnum(); that.countMoney();
that.countMoney(); that.syncCartNum(list);
that.syncCartNum(list); },
}, syncCartNum(cart) {
// if (!cart.sync) {
reduce: function(index) { changeCartNum(cart.id, Math.max(cart.cartNum, 1) || 1)
let that = this; .then(res => {
let list = that.cartList.valid[index]; this.getCartList();
if (list.cartNum <= 1) { this.gainCount();
uni.showToast({ })
title: "已经是底线啦!", .catch(error => {
icon: "none", this.gainCount();
duration: 2000 uni.showToast({
}); title: error.response.data.msg,
return; icon: "none",
} duration: 2000
list.cartNum--; });
if (list.cartNum < 1) {
that.$set(list, "cart_num", 1);
}
that.carnum();
that.countMoney();
that.syncCartNum(list);
},
syncCartNum(cart) {
if (!cart.sync) {
changeCartNum(cart.id, Math.max(cart.cartNum, 1) || 1)
.then(res => {
this.getCartList();
this.gainCount();
})
.catch(error => {
this.gainCount();
uni.showToast({
title: error.response.data.msg,
icon: "none",
duration: 2000
}); });
}); }
} },
}, //
// switchSelect: function (index) {
switchSelect: function(index) { let that = this,
let that = this, cart = that.cartList.valid[index],
cart = that.cartList.valid[index], i = this.checkedIds.indexOf(cart.id);
i = this.checkedIds.indexOf(cart.id); cart.checked = !cart.checked;
cart.checked = !cart.checked;
if (i !== -1) this.checkedIds.splice(i, 1); if (i !== -1) this.checkedIds.splice(i, 1);
if (cart.checked) { if (cart.checked) {
this.checkedIds.push(cart.id); this.checkedIds.push(cart.id);
}
let len = that.cartList.valid.length;
let selectnum = [];
for (let i = 0; i < len; i++) {
if (that.cartList.valid[i].checked === true) {
selectnum.push(true);
} }
} let len = that.cartList.valid.length;
that.isAllSelect = selectnum.length === len; let selectnum = [];
that.$set(that, "cartList", that.cartList); for (let i = 0; i < len; i++) {
that.$set(that, "isAllSelect", that.isAllSelect); if (that.cartList.valid[i].checked === true) {
cookie.set(CHECKED_IDS, that.checkedIds); selectnum.push(true);
that.carnum(); }
that.gainCount();
that.countMoney();
},
//
allChecked: function(e) {
console.log(e);
let that = this;
let selectAllStatus = e.mp.detail.value[0] == "allSelect" ? true : false;
console.log(selectAllStatus);
// let selectAllStatus = that.isAllSelect;
let checkedIds = [];
// for (let i = 0; i < array.length; i++) {
// array[i].checked = selectAllStatus;
// checked.push()
// }
that.cartList.valid.forEach(cart => {
cart.checked = selectAllStatus;
if (selectAllStatus) {
checkedIds.push(cart.id);
} }
}); that.isAllSelect = selectnum.length === len;
let cartList = { that.$set(that, "cartList", that.cartList);
...that.cartList that.$set(that, "isAllSelect", that.isAllSelect);
}; cookie.set(CHECKED_IDS, that.checkedIds);
that.cartList = []; that.carnum();
that.cartList = cartList; that.gainCount();
console.log(this.cartList); that.countMoney();
this.$set(this, "cartList", this.cartList); },
this.$set(this, "isAllSelect", selectAllStatus); //
this.checkedIds = checkedIds; allChecked: function (e) {
cookie.set(CHECKED_IDS, checkedIds); console.log(e);
that.carnum(); let that = this;
that.countMoney(); let selectAllStatus = e.mp.detail.value[0] == "allSelect" ? true : false;
this.$forceUpdate(); console.log(selectAllStatus);
}, // let selectAllStatus = that.isAllSelect;
// let checkedIds = [];
carnum: function() { // for (let i = 0; i < array.length; i++) {
let that = this; // array[i].checked = selectAllStatus;
var carnum = 0; // checked.push()
var array = that.cartList.valid; // }
for (let i = 0; i < array.length; i++) { that.cartList.valid.forEach(cart => {
if (array[i].checked === true) { cart.checked = selectAllStatus;
carnum += parseInt(array[i].cartNum); if (selectAllStatus) {
checkedIds.push(cart.id);
}
});
let cartList = {
...that.cartList
};
that.cartList = [];
that.cartList = cartList;
console.log(this.cartList);
this.$set(this, "cartList", this.cartList);
this.$set(this, "isAllSelect", selectAllStatus);
this.checkedIds = checkedIds;
cookie.set(CHECKED_IDS, checkedIds);
that.carnum();
that.countMoney();
this.$forceUpdate();
},
//
carnum: function () {
let that = this;
var carnum = 0;
var array = that.cartList.valid;
for (let i = 0; i < array.length; i++) {
if (array[i].checked === true) {
carnum += parseInt(array[i].cartNum);
}
} }
} that.$set(that, "cartCount", carnum);
that.$set(that, "cartCount", carnum); },
}, //
// countMoney: function () {
countMoney: function() { let that = this;
let that = this; let carmoney = 0;
let carmoney = 0; let array = that.cartList.valid;
let array = that.cartList.valid; for (let i = 0; i < array.length; i++) {
for (let i = 0; i < array.length; i++) { if (array[i].checked === true) {
if (array[i].checked === true) { carmoney = add(carmoney, mul(array[i].cartNum, array[i].truePrice));
carmoney = add(carmoney, mul(array[i].cartNum, array[i].truePrice)); }
} }
that.countmoney = carmoney;
} }
that.countmoney = carmoney;
} }
} };
};
</script> </script>

4
pages/user/User/index.vue

@ -133,7 +133,7 @@
:login_type="userInfo.login_type" :login_type="userInfo.login_type"
></SwitchWindow>--> ></SwitchWindow>-->
</view> </view>
<Authorization v-if="!$store.getters.token" /> <Authorization v-else />
</view> </view>
</template> </template>
<script> <script>
@ -185,7 +185,7 @@
} }
}); });
}, },
goBindPhone(){ goBindPhone() {
this.$yrouter.push({ this.$yrouter.push({
path: "/pages/user/BindingPhone/index", path: "/pages/user/BindingPhone/index",
}); });

6
剩余问题.js

@ -5,7 +5,7 @@
// ? 未测试出该问题 // ? 未测试出该问题
// 页面都多了一个头部 // 页面都多了一个头部
// ~~延后处理 // ~~ 需要打包h5的时候单独修改配置
// 6、评价图片上传不了 // 6、评价图片上传不了
// ?接口报错,反馈给老徐了 // ?接口报错,反馈给老徐了
@ -14,10 +14,10 @@
// ?接口报错,反馈给老徐了 // ?接口报错,反馈给老徐了
// 12、h5分享关系没形成,看下你那登陆怎么处理的参考下以前的h5 // 12、h5分享关系没形成,看下你那登陆怎么处理的参考下以前的h5
// ~~ 延后处理 // ?前端功能修改完,后台交给老徐了
// 13、海报分享,分享分享调整没问题,因为是首页,但是,商品详情海报,拼团海报,砍价海报路由跳转会有问题 // 13、海报分享,分享分享调整没问题,因为是首页,但是,商品详情海报,拼团海报,砍价海报路由跳转会有问题
// ?商品拼团海报生成的不是小程序码 // ?前端功能修改完,后台交给老徐了
// 海报相关页面 // 海报相关页面
// components/StorePoster.vue 商品详情 // components/StorePoster.vue 商品详情
// > 根据用户来源生成二维码 // > 根据用户来源生成二维码

Loading…
Cancel
Save