修复支付未设置密码时关闭支付前需要输入密码未立即生效问题,修复会员页面周期福利弹窗显示问题

This commit is contained in:
2025-11-13 16:57:13 +08:00
parent bfdd099840
commit 9ee6586e9e
9 changed files with 1185 additions and 370 deletions

View File

@@ -0,0 +1,251 @@
<template>
<up-popup :show="visible" :round="20" mode="bottom" @close="close">
<view class="shop_sku">
<scroll-view scroll-y style="max-height: 60vh; width: 100%">
<view class="positionabsolute">
<up-icon
name="close-circle"
@click="close"
color="#000"
size="25"
></up-icon>
</view>
<up-swiper :list="specifications.item.images" height="250"></up-swiper>
<view class="shop_sku_name">{{ specifications.item.name }}</view>
<view class="shop_sku_description">
{{
specifications.item.shortTitle ? specifications.item.shortTitle : ""
}}
</view>
<view v-if="specifications.item.type != 'package'">
<view
class="shop_sku_box"
v-for="(specOptions, specType) in specifications.item
.selectSpecInfo"
:key="specType"
>
<view class="shop_sku_box_name">
{{ specType }}
</view>
<view class="flex-start">
<view
class="shop_sku_box_item"
v-for="option in specOptions"
:key="option"
@click="selectSpec(specType, option)"
:class="{
shop_sku_box_item_selected: isSelected(option),
}"
>
{{ option }}
<view
class="shop_sku_box_item_tip"
v-if="
specifications.item.result &&
specifications.item.result.isSoldStock == 1 &&
selectedSpecs[specType] === option
"
>
<view>售罄</view>
</view>
<view
class="shop_sku_box_item_tip"
v-if="
specifications.item.result == 'kong' &&
canSubmit == false &&
selectedSpecs[specType] === option
"
>
<view>已下架</view>
</view>
</view>
</view>
</view>
</view>
<!-- 套餐 -->
<view v-else>
<view class="shop_sku_box">
<view
v-for="(setmenu, setmenuindex) in specifications.item.groupSnap"
:key="setmenuindex"
>
<view class="shop_sku_box_name"
>{{ setmenu.title }} {{ setmenu.count }} 选{{
setmenu.number
}}</view
>
<view class="flex-start">
<view
class="shop_sku_box_item"
v-for="(option, goodsid) in setmenu.goods"
:key="goodsid"
@click="goodsidClick(setmenuindex, option, goodsid)"
:class="{
shop_sku_box_item_selected: isOptionSelected(
setmenuindex,
option
),
}"
:disabled="
isMaxSelected(setmenuindex) &&
!isOptionSelected(setmenuindex, option)
"
>
{{ option.proName }}
<text v-if="option.unitName">/{{ option.unitName }}</text>
<view
class="shop_sku_box_item_tip"
v-if="specifications.item.isSoldStock == 1"
>
<view>售罄</view>
</view>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
<view class="shop_bottom">
<view class="flex-between">
<view
class="price"
v-if="
specifications.item.type != 'package' &&
specifications.item.result
"
>
<text class="i">¥</text>
<view class="num">
<GoodsPrice
:limitDiscount="limitTimeDiscountRes"
:cart="specifications.item.result"
:shopUserInfo="shopUserInfo"
:shopInfo="shopInfo"
></GoodsPrice>
</view>
<text class="num" v-if="false">
{{
shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1
? specifications.item.result.memberPrice ||
specifications.item.result.salePrice
: specifications.item.result.salePrice
}}
</text>
<text class="i" v-if="specifications.item.unitName"
>/{{ specifications.item.unitName }}</text
>
<text v-if="specifications.item.result.suitNum > 1"
>「{{ specifications.item.result.suitNum
}}{{ specifications.item.result.unitName }}起点」</text
>
</view>
<view class="price" v-else>
<text class="i">¥</text>
<view class="num">
<GoodsPrice
:limitDiscount="limitTimeDiscountRes"
:cart="specifications.item"
:shopUserInfo="shopUserInfo"
:shopInfo="shopInfo"
></GoodsPrice>
</view>
<text class="num" v-if="false">
{{
shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1
? specifications.item.memberPrice ||
specifications.item.salePrice
: specifications.item.salePrice
}}
</text>
<text class="i" v-if="specifications.item.unitName"
>/{{ specifications.item.unitName }}</text
>
<text v-if="specifications.item.suitNum > 1"
>「{{ specifications.item.suitNum
}}{{ specifications.item.unitName }}起点」</text
>
</view>
<view
class="operation-wrap"
v-if="specifications.item.type != 'package'"
>
<view class="btn">
<up-icon
name="minus-circle-fill"
color="#E9AB7A"
size="25"
v-if="shopCartNumber > 0"
></up-icon>
<view class="btnClick" @click="shopCart('-')"></view>
</view>
<text class="num">{{ shopCartNumber }}</text>
<view class="btn">
<up-icon
name="plus-circle-fill"
color="#E9AB7A"
size="25"
></up-icon>
<view class="btnClick" @click="shopCart('+')"></view>
</view>
</view>
</view>
<view class="shop_skuselect flex-start" v-if="selectedSpecsStr">
<view class="shop_skuselectname">{{ selectedSpecsStr }}</view>
</view>
<view
v-if="specifications.item.type == 'package'"
class="addShopping"
:class="shopCartNumber > 0 && allConditionsSatisfied ? 'active' : ''"
@click="submitSelection()"
>
{{ skuBtnText }}
</view>
<view
v-else
class="addShopping"
:class="shopCartNumber > 0 && canSubmit ? 'active' : ''"
@click="submitSelection()"
>
{{ skuBtnText }}
</view>
</view>
</view>
</up-popup>
</template>
<script setup>
import { ref } from "vue";
const props = defineProps({
data: {
type: Object,
default: () => {},
},
specifications: {
type: Object,
default: () => {
return {
item: {},
}
},
},
});
const visible = defineModel({
default: false,
});
function close() {
visible.value = false;
}
const selectedSpecs = ref({});
function isSelected(option) {
return selectedSpecs.value[specType] === option;
}
</script>
<style scoped lang="scss">
.box {
width: 100%;
height: 200px;
background-color: #f5f5f5;
}
</style>

View File

@@ -65,6 +65,7 @@
>限时折扣</view
>
<image
@click.stop="getImgs(item)"
class="panelfiveitemimage"
:src="item.coverImg"
mode="aspectFill"
@@ -318,6 +319,7 @@
>
<image
class="goodsImg"
@click.stop="getImgs(item1)"
v-if="item1.coverImg != null"
:lazy-load="true"
@load="imageLoaded(item1, index, index1)"
@@ -335,6 +337,7 @@
v-else
:lazy-load="true"
></image>
<view
class="vifgoodsImg"
v-if="
@@ -595,10 +598,24 @@
</view>
<up-swiper
:list="specifications.item.images"
@change="swiperChange"
:current="swiperCurrent"
radius="6px"
height="250"
></up-swiper>
@click="
prveImgs(
specifications.item.images,
specifications.item.images[swiperCurrent]
)
"
>
<!-- <template v-slot:default="{item}">
<image :src=item></image>
</templte> -->
</up-swiper>
<view class="shop_sku_name">{{ specifications.item.name }}</view>
<view class="shop_sku_description">
<view class="shop_sku_description" v-if="isSkuGoods">
{{
specifications.item.shortTitle
? specifications.item.shortTitle
@@ -622,8 +639,7 @@
:key="option"
@click="selectSpec(specType, option)"
:class="{
shop_sku_box_item_selected:
selectedSpecs[specType] === option,
shop_sku_box_item_selected: isSkuSelected(specType, option),
}"
>
{{ option }}
@@ -783,24 +799,35 @@
<view class="shop_skuselect flex-start" v-if="selectedSpecsStr">
<view class="shop_skuselectname">{{ selectedSpecsStr }}</view>
</view>
<view
v-if="specifications.item.type == 'package'"
class="addShopping"
:class="
shopCartNumber > 0 && allConditionsSatisfied ? 'active' : ''
"
@click="submitSelection()"
>
{{ skuBtnText }}
</view>
<view
v-else
class="addShopping"
:class="shopCartNumber > 0 && canSubmit ? 'active' : ''"
@click="submitSelection()"
>
{{ skuBtnText }}
</view>
<template v-if="isSkuGoods">
<view
v-if="specifications.item.type == 'package'"
class="addShopping"
:class="
shopCartNumber > 0 && allConditionsSatisfied ? 'active' : ''
"
@click="submitSelection()"
>
{{ skuBtnText }}
</view>
<view
v-else
class="addShopping"
:class="shopCartNumber > 0 && canSubmit ? 'active' : ''"
@click="submitSelection()"
>
{{ skuBtnText }}
</view>
</template>
<template v-else>
<view
class="addShopping"
:class="shopCartNumber > 0 ? 'active' : ''"
@click="submitSelection()"
>
{{ skuBtnText }}
</view>
</template>
</view>
</view>
</up-popup>
@@ -818,10 +845,17 @@
v-if="isDataLoaded"
@onBuyClick="onBuyClick"
></recommendGoodsModal>
<goodsModal></goodsModal>
<xbSwiperPreview
:visable="showPrveImg"
:imgs="prveImgsList"
@update:visable="showPrveImg = $event"
></xbSwiperPreview>
</view>
</template>
<script setup>
import xbSwiperPreview from "@/components/xb-swiper-preview/index.vue";
//价格计算辅助函数
import * as orderUtils from "@/utils/order-utils.js";
import BigNumber from "bignumber.js";
@@ -854,6 +888,7 @@ import {
//导航栏
import Nav from "@/components/CustomNavbar.vue";
import shopindex from "./components/shopindex.vue";
import goodsModal from "./components/goods-modal.vue";
import shoppingCartes from "./components/shoppingCartes.vue";
import confirmorder from "./components/confirmorder.vue";
import Loading from "@/components/Loading.vue";
@@ -956,6 +991,11 @@ Object.assign(shopInfo, uni.cache.get("shopInfo"));
const shopTable = uni.cache.get("shopTable");
const distance = uni.cache.get("distance"); //距离
const swiperCurrent = ref(0);
function swiperChange(e) {
swiperCurrent.value = e.current;
}
//店铺详情
const showShopInfoRef = ref(null);
@@ -1136,6 +1176,10 @@ const allSpecsSelected = computed(() => {
return specKeys.every((key) => selectedSpecs.value[key]);
});
function isSkuSelected(specType, option) {
return selectedSpecs.value[specType] === option;
}
// 处理规格选择的方法
const selectSpec = async (specType, option) => {
// 规格清零
@@ -1260,13 +1304,24 @@ const selectedSpecsStr = computed(() => {
//添加购物车数量
const shopCartNumber = ref(0);
// 多规格 套餐添加数量
// 多规格 套餐 单规格添加数量
const shopCart = async (i) => {
if (i == "-" && shopCartNumber.value >= 0) {
shopCartNumber.value = 0;
return false;
}
let res = await shoppingcart();
// if (!isSkuGoods.value) {
// console.log("specifications.item", specifications.item);
// if (i == "-") {
// shopCartNumber.value--;
// } else {
// shopCartNumber.value++;
// }
// specifications.item.cartNumber = shopCartNumber.value;
// singleclick(specifications.item, i);
// return;
// }
if (i == "-") {
if (!res && shopCartNumber.value == specifications.item.suitNum) {
uni.showToast({
@@ -1386,11 +1441,14 @@ const shoppingcart = async () => {
}
);
res = await matchingProduct(selectedGroupSnap.value);
} else {
} else if (specifications.item.type == "sku") {
if (!canSubmit.value) {
return false;
}
res = await matchingProduct(specifications.item.result);
} else {
// 单规格
res = await matchingProduct(specifications.item);
}
return res;
};
@@ -1414,12 +1472,12 @@ const submitSelection = async () => {
if (shopCartNumber.value <= 0) {
return;
}
let res = await shoppingcart();
if (
(specifications.item.type == "package" && allConditionsSatisfied.value) ||
(specifications.item.type == "sku" && canSubmit.value)
) {
let res = await shoppingcart();
// 是否是套餐 有就传
if (specifications.item.type == "package") {
// 需求更改:所所有商品套餐都是add,没有修改
@@ -1427,7 +1485,7 @@ const submitSelection = async () => {
} else {
selectedGroupSnap.value = [];
}
console.log('specifications.item', specifications.item);
console.log("specifications.item", specifications.item);
websocketsendMessage({
id: res ? res.cartListId : "",
type: "shopping",
@@ -1451,25 +1509,84 @@ const submitSelection = async () => {
selectedGroupSnap.value = [];
showShopsku.value = false;
} else {
websocketsendMessage({
id: res ? res.cartListId : "",
type: "shopping",
suitNum: specifications.productListitem.suitNum,
table_code: uni.cache.get("tableCode"),
shop_id: uni.cache.get("shopId"),
operate_type: res ? "edit" : "add",
product_id: specifications.product_id,
sku_id: specifications.sku_id,
number: res
? await calculateValue(res.cartNumber, "+", shopCartNumber.value)
: shopCartNumber.value,
memberPrice: specifications.item.memberPrice,
is_print: 1,
product_type: specifications.item.type,
is_time_discount: specifications.item.is_time_discount,
});
showShopsku.value = false;
return;
}
};
//获取多规格数据
const clickspecifications = async (item, index, indexs, type) => {
console.log(item);
// 商品类型 single-单规格商品 sku-多规格商品 package-套餐商品 weight-称重商品 coupon-团购券
//返回是否是多规格商品
function returnIsSkuGoods(item) {
if (
item.isSoldStock == 1 ||
(item.isSaleTime == 0 && !item.isSaleTimeshow) ||
item.type == "single" ||
item.type == "weight" ||
(item.type == "package" && item.groupType == "0")
) {
return false;
}
// 数量清零
return true;
}
const isSkuGoods = computed(() => {
return returnIsSkuGoods(specifications.item);
});
//预览图
const showPrveImg = ref(false);
const prveImgsList = ref([]);
function prveImgs(images) {
prveImgsList.value = images;
showPrveImg.value = true;
return;
uni.previewImage({
urls: images,
current: swiperCurrent.value,
});
}
async function getImgs(item) {
let res = await APIminiAppinfo(item.id);
prveImgs(res.images);
}
//获取多规格数据
const clickspecifications = async (item, index, indexs, type) => {
console.log(item);
// 商品类型 single-单规格商品 sku-多规格商品 package-套餐商品 weight-称重商品 coupon-团购券
// if (
// item.isSoldStock == 1 ||
// (item.isSaleTime == 0 && !item.isSaleTimeshow) ||
// item.type == "single" ||
// item.type == "weight" ||
// (item.type == "package" && item.groupType == "0")
// ) {
// return false;
// }
if (item.isSoldStock == 1 || (item.isSaleTime == 0 && !item.isSaleTimeshow)) {
return false;
}
shopCartNumber.value = 0;
// 数量清零
// 初始化
let data = {
item: item,
@@ -1485,12 +1602,23 @@ const clickspecifications = async (item, index, indexs, type) => {
// skuBtnText.value = '请选择规格'
// single-单规格商品 sku-多规格商品 package-套餐商品 weight-称重商品 coupon-团购券
let res = await APIminiAppinfo(item.id);
specifications.item = {...res,is_time_discount:item.is_time_discount};
console.log("res", res);
console.log("item", item);
specifications.item = {
...res,
...item,
product_id: res.id,
sku_id: item.skuId,
};
if (specifications.item.type == "package") {
selectedOptions.value = [];
specifications.product_id = res.id;
specifications.sku_id = item.skuId;
shopCartNumber.value = 1;
} else {
specifications.product_id = res.id || specifications.item.product_id;
specifications.sku_id = item.skuId || specifications.item.sku_id;
}
// 购物车是否有商品
specifications.type = res.type;
@@ -1548,6 +1676,7 @@ const isProductAvailable = async (sellDaysStr, startTimeStr, endTimeStr) => {
// 单规格
const singleclick = async (item, i) => {
console.log("单规格商品点击事件:", item, i);
if (!isProductAvailable(item.days, item.startTime, item.endTime)) {
uni.showToast({
title: "不在可售时间内",
@@ -1962,7 +2091,11 @@ const totalPrices = computed(() => {
}
});
}
if (limitTimeDiscountRes.value && limitTimeDiscountRes.value.id && item.is_time_discount==1) {
if (
limitTimeDiscountRes.value &&
limitTimeDiscountRes.value.id &&
item.is_time_discount == 1
) {
//限时折扣
const price = orderUtils.returnPrice({
goods: item,
@@ -1974,7 +2107,10 @@ const totalPrices = computed(() => {
return total + parseFloat(price) * parseFloat(item.cartNumber);
}
// 是否启用会员价 0否1是
if (shopUserInfo.isVip == 1 && shopUserInfo.isMemberPrice == 1) {
if (
shopUserInfo.value.isVip == 1 &&
shopUserInfo.value.isMemberPrice == 1
) {
// memberPrice会员价
return (
total +
@@ -2221,12 +2357,12 @@ onShow(async () => {
onHide(() => {
console.log("product index onHide");
useSocket.closeSocket();
useSocket.setOnMessage(()=>{});
useSocket.setOnMessage(() => {});
});
onUnload(() => {
console.log("product index onUnload");
useSocket.closeSocket();
useSocket.setOnMessage(()=>{});
useSocket.setOnMessage(() => {});
});
onMounted(async () => {
@@ -2237,6 +2373,7 @@ onMounted(async () => {
const currentPage = pages[pages.length - 1];
// 获取页面参数
const options = currentPage.options;
console.log("onMounted", options);
let res = await APIhistoryOrder({
tableCode: uni.cache.get("tableCode"),
});
@@ -2882,7 +3019,7 @@ function toHistory() {
border-radius: 20rpx;
background: #fff;
box-sizing: border-box;
padding-bottom: 250rpx;
padding-bottom: 200rpx;
.positionabsolute {
position: absolute;