diff --git a/common/api/apiPrve.js b/common/api/apiPrve.js
new file mode 100644
index 0000000..01c4ed6
--- /dev/null
+++ b/common/api/apiPrve.js
@@ -0,0 +1,3 @@
+export const urlAccount = '/account'
+export const urlProduct = '/product'
+export const urlOrder = '/order'
diff --git a/common/api/product/product.js b/common/api/product/product.js
index e06706c..59e5625 100644
--- a/common/api/product/product.js
+++ b/common/api/product/product.js
@@ -1,8 +1,7 @@
// 引入 request 文件
import request from '@/common/api/request.js'
-const urlAccount = '/account'
-const urlProduct = '/product'
-const urlOrder = '/order'
+
+import {urlAccount,urlProduct,urlOrder} from '@/common/api/apiPrve.js'
//获取商品列表数据
export const APIproductqueryProduct = (data) => {
@@ -46,4 +45,13 @@ export const APIminiAppskuinfo = (data) => {
method: 'get',
data: data
})
+}
+
+//获取相关推荐商品
+export const productRelated = (data) => {
+ return request({
+ url: urlProduct + '/user/product/related/'+id.id,
+ method: 'get',
+ data: data
+ })
}
\ No newline at end of file
diff --git a/pages/product/components/goods-modal.vue b/pages/product/components/goods-modal.vue
index fd3b53c..bacfc57 100644
--- a/pages/product/components/goods-modal.vue
+++ b/pages/product/components/goods-modal.vue
@@ -1,251 +1,623 @@
-
-
-
-
-
-
-
- {{ specifications.item.name }}
-
- {{
- specifications.item.shortTitle ? specifications.item.shortTitle : ""
- }}
-
-
-
-
- {{ specType }}
-
-
-
- {{ option }}
-
- 售罄
-
-
- 已下架
-
-
-
-
-
-
-
-
-
- {{ setmenu.title }} {{ setmenu.count }} 选{{
- setmenu.number
- }}
-
-
- {{ option.proName }}
- /{{ option.unitName }}
-
- 售罄
-
-
-
-
-
-
-
-
-
-
- ¥
-
-
-
+
+
+
+
+
+
-
- {{
- shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1
- ? specifications.item.result.memberPrice ||
- specifications.item.result.salePrice
- : specifications.item.result.salePrice
- }}
-
- /{{ specifications.item.unitName }}
- 「{{ specifications.item.result.suitNum
- }}{{ specifications.item.result.unitName }}起点」
-
-
- ¥
-
-
-
-
- {{
- shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1
- ? specifications.item.memberPrice ||
- specifications.item.salePrice
- : specifications.item.salePrice
- }}
-
- /{{ specifications.item.unitName }}
- 「{{ specifications.item.suitNum
- }}{{ specifications.item.unitName }}起点」
-
+
+
-
-
-
-
-
- {{ shopCartNumber }}
-
-
-
-
-
-
-
- {{ selectedSpecsStr }}
-
-
- {{ skuBtnText }}
-
-
- {{ skuBtnText }}
-
-
-
-
+ {{ goods.name }}
+
+ {{ goods.shortTitle ? goods.shortTitle : '' }}
+
+
+
+
+ {{ specType }}
+
+
+
+ {{ option }}
+
+ 售罄
+
+
+ 已下架
+
+
+
+
+
+
+
+
+
+ {{ setmenu.title }} {{ setmenu.count }}
+ 选{{ setmenu.number }}
+
+
+ {{ option.proName }}
+ /{{ option.unitName }}
+
+ 售罄
+
+
+
+
+
+
+
+
+
+ 推荐搭配
+
+
+
+
+
+ 商品名
+
+
+
+
+ ¥
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥
+
+
+
+
+
+ {{
+ shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1
+ ? goods.result.memberPrice || goods.result.salePrice
+ : goods.result.salePrice
+ }}
+
+ /{{ goods.unitName }}
+ 「{{ goods.result.suitNum }}{{ goods.result.unitName }}起点」
+
+
+ ¥
+
+
+
+
+ {{
+ shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1
+ ? goods.memberPrice || goods.salePrice
+ : goods.salePrice
+ }}
+
+ /{{ goods.unitName }}
+ 「{{ goods.suitNum }}{{ goods.unitName }}起点」
+
+
+
+
+
+
+
+ {{ shopCartNumber }}
+
+
+
+
+
+
+
+ {{ selectedSpecsStr }}
+
+
+
+ 库存不足
+
+
+
+
+
+ {{ skuBtnText }}
+
+
+ {{ skuBtnText }}
+
+
+
+
+ {{ skuBtnText }}
+
+
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/pages/product/index.vue b/pages/product/index.vue
index b718ad8..7898072 100644
--- a/pages/product/index.vue
+++ b/pages/product/index.vue
@@ -52,8 +52,8 @@
-
+
限时折扣{{ limitDiscountCountdown }}
{{ returnGoodsImCartNum(item) < 99 ? returnGoodsImCartNum(item) : '99+' }}
+ v-if="returnGoodsImCartNum(item)">{{ returnGoodsImCartNum(item) < 99 ? returnGoodsImCartNum(item) : '99+' }}
@@ -199,8 +199,8 @@
-
选规格
-
- {{ returnGoodsImCartNum(item1) < 99 ? returnGoodsImCartNum(item1) : '99+' }}
+
+ {{ returnGoodsImCartNum(item1) < 99 ? returnGoodsImCartNum(item1) : '99+' }}
@@ -442,13 +442,39 @@
-
+
-
+
+ 推荐搭配
+
+
+
+
+
+ 商品名
+
+
+
+
+ ¥
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
@@ -603,7 +629,8 @@
productminiApphotsquery,
APIgroupquery,
APIminiAppinfo,
- APIminiAppskuinfo
+ APIminiAppskuinfo,
+ productRelated
} from '@/common/api/product/product.js';
import {
@@ -680,8 +707,8 @@
import {
useNavbarStore
} from '@/stores/navbarStore';
-
-
+
+
import {
useWebSocket
} from '@/stores/carts-websocket.js';
@@ -709,7 +736,9 @@
import {
useCartStore
} from '@/stores/order.js';
-import { computed } from 'vue';
+ import {
+ computed
+ } from 'vue';
const cartStore = useCartStore();
/**
* store本地存储 end
@@ -760,6 +789,8 @@ import { computed } from 'vue';
/**
* 通用数据合集 start
*/
+ const showGoodsModal = ref(false)
+
// 门店信息
const shopInfo = reactive({});
Object.assign(shopInfo, uni.cache.get('shopInfo'));
@@ -810,35 +841,35 @@ import { computed } from 'vue';
};
-
-
-
-
-
+
+
+
+
+
// 购物车对应的商品数
- const GoodsIDInCartNumMap=computed(()=>{
- const map={}
- for(let cart in cartStore.carts){
- if(map[cart.product_id]){
- map[cart.product_id]+=cart.number*1
- }else{
- map[cart.product_id]=cart.number*1
+ const GoodsIDInCartNumMap = computed(() => {
+ const map = {}
+ for (let cart in cartStore.carts) {
+ if (map[cart.product_id]) {
+ map[cart.product_id] += cart.number * 1
+ } else {
+ map[cart.product_id] = cart.number * 1
}
-
+
}
return map
})
-
+
/**
* 返回购物车对应的商品数量
*/
- function returnGoodsImCartNum(goods){
- if(GoodsIDInCartNumMap.value.hasOwnProperty([goods.id]) ){
+ function returnGoodsImCartNum(goods) {
+ if (GoodsIDInCartNumMap.value.hasOwnProperty([goods.id])) {
GoodsIDInCartNumMap.value[goods.id]
}
return 0
}
-
+
// 获取商品数据
const shopProductList = reactive({
@@ -1305,9 +1336,9 @@ import { computed } from 'vue';
//预览图
const showPrveImg = ref(false);
const prveImgsList = ref([]);
-
- function updateShowPrveImg(e){
- showPrveImg.value=e
+
+ function updateShowPrveImg(e) {
+ showPrveImg.value = e
}
function prveImgs(images) {
@@ -1321,14 +1352,14 @@ import { computed } from 'vue';
}
async function getProductImgs(item) {
- console.log('getProductImgs',item)
+ console.log('getProductImgs', item)
let res = await APIminiAppinfo(item.id);
prveImgs(res.images);
}
//获取多规格数据
const clickspecifications = async (item, index, indexs, type) => {
- console.log('clickspecifications',item);
+ console.log('clickspecifications', item);
// 商品类型 single-单规格商品 sku-多规格商品 package-套餐商品 weight-称重商品 coupon-团购券
// if (
// item.isSoldStock == 1 ||
@@ -1386,7 +1417,8 @@ import { computed } from 'vue';
.filter(([_, value]) => value.length > 0));
// 给默认数量
specifications.item.amountcartNumber = 0;
- showShopsku.value = true;
+ // showShopsku.value = true;
+ showGoodsModal.value=true
};
// 判断商品是否在可售时间内
const isProductAvailable = async (sellDaysStr, startTimeStr, endTimeStr) => {
@@ -1622,11 +1654,11 @@ import { computed } from 'vue';
function cartInit(arr) {
const result = []
- console.log('cartInitArr',arr);
- console.log('allGoodsArr',allGoodsArr);
+ console.log('cartInitArr', arr);
+ console.log('allGoodsArr', allGoodsArr);
cartStore.carts = arr.map(v => {
const goods = allGoodsArr.find(g => g.id == v.product_id)
- const goodsSkuList = goods?goods.skuList : []
+ const goodsSkuList = goods ? goods.skuList : []
const findSku = goodsSkuList.find(sku => sku.id == v.sku_id)
const memberPrice = findSku ? findSku.memberPrice : 0
const is_time_discount = limitUtils.canUseLimitTimeDiscount({
@@ -1634,7 +1666,7 @@ import { computed } from 'vue';
memberPrice
}, cartStore.limitTimeDiscount, shopInfo,
shopUserInfo.value, 'product_id');
- if(!goods){
+ if (!goods) {
useSocket.sendMessage({
id: v.id,
operate_type: "del",
@@ -1649,7 +1681,7 @@ import { computed } from 'vue';
is_time_discount: is_time_discount ? 1 : 0,
memberPrice
}
- }).filter(v=>v)
+ }).filter(v => v)
for (let cart of arr) {
const findItem = cartStore.carts.find(v => v.id == cart.id)
@@ -1826,7 +1858,7 @@ import { computed } from 'vue';
});
}
-
+
//除去p 每次返回都回执消息
await websocketsendMessage({
@@ -2120,11 +2152,11 @@ import { computed } from 'vue';
}
return currentTime >= startTime && currentTime <= endTime;
});
- let allGoodsArr=[]
+ let allGoodsArr = []
// 列表请求
const productqueryProduct = async () => {
cartStore.goodsIsloading = false;
- allGoodsArr=[]
+ allGoodsArr = []
try {
shopProductList.hots = await productminiApphotsquery();
shopProductList.productInfo = await APIgroupquery();
@@ -2144,8 +2176,8 @@ import { computed } from 'vue';
group.productList.forEach(async (product) => {
product.isSaleTimeshow = await isProductAvailable(product.days, product
.startTime, product.endTime);
-
- allGoodsArr.push(product)
+
+ allGoodsArr.push(product)
cartStore.setGoodsMap(product.id, product);
});
@@ -2156,11 +2188,11 @@ import { computed } from 'vue';
cartStore.setGoodsMap(i.id, i);
});
console.log('shopProductList', shopProductList);
-
- if(cartStore.carts.length>0){
+
+ if (cartStore.carts.length > 0) {
cartInit(cartStore.carts)
}
-
+
cartStore.goodsIsloading = true;
scrollTopSize.value = 0;
topArr.value = [];
@@ -2415,7 +2447,7 @@ import { computed } from 'vue';
tableCode: uni.cache.get('tableCode')
});
oldOrder.value = res;
- if (res && res.id && shopInfo.registerType == 'after'&&!e.noJump) {
+ if (res && res.id && shopInfo.registerType == 'after' && !e.noJump) {
toHistory();
return;
}
@@ -2475,8 +2507,8 @@ import { computed } from 'vue';
idKey: 'id'
});
}
-
- function watchEmit(){
+
+ function watchEmit() {
uni.$off('updateProductIndex')
uni.$on('updateProductIndex', function(data) {
getNewUserDiscount()
@@ -2530,12 +2562,12 @@ import { computed } from 'vue';
});
if (res && typeof res == 'object') {
newUserDiscount.value = res;
- cartStore.consumeDiscount=res
- cartStore.newUserDiscount=res.amount
- }else{
+ cartStore.consumeDiscount = res
+ cartStore.newUserDiscount = res.amount
+ } else {
newUserDiscount.value = null;
- cartStore.consumeDiscount={}
- cartStore.newUserDiscount=0
+ cartStore.consumeDiscount = {}
+ cartStore.newUserDiscount = 0
}
}
@@ -2595,8 +2627,8 @@ import { computed } from 'vue';
return 0
})
const oldOrder = ref(null);
-
-
+
+
// 限时折扣
async function getLimitDiscount() {
const limitRes = await limitTimeDiscountapi.getConfig({
@@ -3233,7 +3265,6 @@ import { computed } from 'vue';
border-radius: 20rpx;
background: #fff;
box-sizing: border-box;
- padding-bottom: 200rpx;
.positionabsolute {
position: absolute;
@@ -3268,9 +3299,7 @@ import { computed } from 'vue';
border-bottom: 2rpx solid #f0f0f0;
}
- .shop_sku_box:last-child {
- padding-bottom: 140rpx;
- }
+
.shop_sku_box {
padding: 20rpx;
@@ -3356,9 +3385,6 @@ import { computed } from 'vue';
padding: 30rpx 28rpx;
background-color: #fff;
box-shadow: 0rpx -6rpx 14rpx 2rpx rgba(0, 0, 0, 0.1);
- position: fixed;
- left: 0;
- bottom: 0;
.price {
display: flex;
@@ -3734,4 +3760,31 @@ import { computed } from 'vue';
font-size: 12px;
margin-left: 20rpx;
}
+
+ .recommand-goods {
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: 24rpx;
+
+ .item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin-right: 30rpx;
+ margin-bottom: 30rpx;
+ width: 210rpx;
+
+ &:nth-child(3n) {
+ margin-right: 0;
+ }
+
+ .name {
+ height: 84rpx;
+ }
+
+ .info {
+ width: 100%;
+ }
+ }
+ }
\ No newline at end of file