分销问题修复,订单问题修复

This commit is contained in:
2025-10-30 17:11:18 +08:00
parent 6283d168e9
commit 09fc28de06
29 changed files with 2652 additions and 533 deletions

285
components/devetools.vue Normal file
View File

@@ -0,0 +1,285 @@
<template>
<view class="floating-widget" v-if="show">
<!-- 悬浮按钮 -->
<view
class="floating-btn"
@click="togglePopup"
:style="{
backgroundColor: btnColor,
width: `${btnSize}px`,
height: `${btnSize}px`,
}"
:class="{ active: isPopupVisible }"
>
<up-icon
name="plus"
size="24"
color="#ffffff"
:class="{ rotate: isPopupVisible }"
></up-icon>
</view>
<!-- 操作弹窗 -->
<view class="popup" v-if="isPopupVisible" :class="{ show: isPopupVisible }">
<view class="popup-arrow"></view>
<view class="popup-content">
<view
class="popup-item"
v-for="(item, index) in operations"
:key="index"
@click="handleOperation(item.action)"
>
<text class="item-text">{{ item.name }}</text>
</view>
</view>
</view>
<!-- 点击外部关闭遮罩 -->
<view class="overlay" v-if="isPopupVisible" @click="closePopup"></view>
</view>
</template>
<script setup>
import { ref, defineProps, defineEmits,computed } from "vue";
const show=computed(()=>{
const sysInfo=uni.getAccountInfoSync();
if(sysInfo&&sysInfo.miniProgram && (sysInfo.miniProgram.envVersion == 'release'||sysInfo.miniProgram.envVersion == 'develop')) {
return true;
}
return false
})
// 定义组件属性
const props = defineProps({
// 操作选项列表
operations: {
type: Array,
default: () => [
{
name: "复制token",
icon: "arrowup",
action: "token",
color: "#007aff",
},
{
name: "复制用户信息",
icon: "userInfo",
action: "userInfo",
color: "#52c41a",
},
{
name: "获取登录code",
icon: "userInfo",
action: "getLoginCode",
color: "#52c41a",
},
{
name: "复制当前门店信息",
icon: "userInfo",
action: "copyStoreInfo",
color: "#52c41a",
},
{
name: "复制当前门店用户信息",
icon: "userInfo",
action: "copyStoreUserInfo",
color: "#52c41a",
},
],
},
// 悬浮按钮颜色
btnColor: {
type: String,
default: "#007aff",
},
// 悬浮按钮大小(px)
btnSize: {
type: Number,
default: 60,
},
// 弹窗距离底部的距离
bottomDistance: {
type: Number,
default: 20,
},
// 弹窗距离右侧的距离
rightDistance: {
type: Number,
default: 20,
},
});
// 定义组件事件
const emit = defineEmits(["onOperation", "onOpen", "onClose"]);
// 弹窗显示状态
const isPopupVisible = ref(false);
// 切换弹窗显示/隐藏
const togglePopup = () => {
isPopupVisible.value = !isPopupVisible.value;
if (isPopupVisible.value) {
emit("onOpen");
} else {
emit("onClose");
}
};
// 关闭弹窗
const closePopup = () => {
if (isPopupVisible.value) {
isPopupVisible.value = false;
emit("onClose");
}
};
async function getWxloginCode(){
return new Promise((resolve, reject) => {
uni.login({
success: (res) => {
if (res.code) {
resolve(res.code);
} else {
console.log("获取登录凭证code失败" + res.errMsg);
reject(res.errMsg);
}
},
});
});
}
// 处理操作选择
const handleOperation = async (action) => {
let data='';
if (action == "token") {
data=uni.cache.get("token");
}
if (action == "userInfo") {
data=JSON.stringify(uni.cache.get("userInfo"));
}
if(action == "getLoginCode"){
data=await getWxloginCode();
}
if(action == "copyStoreInfo"){
data=JSON.stringify(uni.cache.get("shopInfo"));
}
if(action == "copyStoreUserInfo"){
data=JSON.stringify(uni.cache.get("shopUserInfo"));
}
console.log('data',data)
uni.setClipboardData({
data: data,
success: function () {},
});
emit("onOperation", action);
closePopup();
};
</script>
<style scoped>
.floating-widget {
position: fixed;
right: v-bind(rightDistance + "px");
bottom: v-bind(bottomDistance + "px");
z-index: 9999;
display: flex;
flex-direction: column;
align-items: flex-end;
}
/* 悬浮按钮样式 */
.floating-btn {
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
background: linear-gradient(98deg, #fe6d1100 40.64%, #ffd1b4 105.2%),
linear-gradient(259deg, #fe6d11 50.14%, #ffd1b4 114.93%);
box-shadow: 0 0.4375rem 0.95rem 0 #fe8b435e;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 1001;
}
.floating-btn.active {
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
transform: scale(1.05);
}
.floating-btn .rotate {
transform: rotate(45deg);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
/* 弹窗样式 */
.popup {
position: absolute;
bottom: calc(100% + 15px);
right: 0;
min-width: 160px;
background-color: #ffffff;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
opacity: 0;
transform: translateY(10px) scale(0.95);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 1000;
pointer-events: none;
}
.popup.show {
opacity: 1;
transform: translateY(0) scale(1);
pointer-events: auto;
}
/* 弹窗箭头 */
.popup-arrow {
position: absolute;
right: 20px;
bottom: -8px;
width: 16px;
height: 16px;
background-color: #ffffff;
transform: rotate(45deg);
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.05);
}
.popup-content {
padding: 8px 0;
position: relative;
z-index: 1;
}
/* 操作选项样式 */
.popup-item {
display: flex;
align-items: center;
padding: 12px 20px;
cursor: pointer;
transition: background-color 0.2s ease;
}
.popup-item:hover {
background-color: #f5f7fa;
}
.item-text {
margin-left: 12px;
font-size: 14px;
color: #333333;
line-height: 1;
}
/* 遮罩层样式 */
.overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0);
z-index: 999;
}
</style>

View File

@@ -1,11 +1,24 @@
<template>
<text v-if="limitDiscount && limitDiscount.id" class="limit-price">
{{ returnPrice() }}
</text>
<text v-else>
<text v-if="shopInfo.isMemberPrice == 1 && shopUserInfo.isVip == 1" class="memberPrice">
{{ cart.memberPrice || cart.salePrice }}
<block v-if="limitDiscount && limitDiscount.id" class="limit-price">
<text>
{{ returnPrice() }}
</text>
</block>
<text v-else>
<block
v-if="
shopUserInfo.isMemberPrice == 1 &&
shopUserInfo.isVip == 1 &&
cart.memberPrice * 1 > 0
"
class="memberPrice"
>
<text>
{{ cart.memberPrice }}
</text>
</block>
<text v-else class="salePrice">{{ cart.salePrice }}</text>
</text>
</template>
@@ -14,15 +27,14 @@
import BigNumber from "bignumber.js";
import * as orderUtils from "@/utils/order-utils.js";
function returnPrice(){
function returnPrice() {
return orderUtils.returnPrice({
goods:props.cart,
shopInfo:props.shopInfo,
limitTimeDiscountRes:props.limitDiscount,
shopUserInfo:props.shopUserInfo,
idKey:props.idKey
})
goods: props.cart,
shopInfo: props.shopInfo,
limitTimeDiscountRes: props.limitDiscount,
shopUserInfo: props.shopUserInfo,
idKey: props.idKey,
});
}
const props = defineProps({
@@ -31,9 +43,9 @@ const props = defineProps({
type: Object,
default: () => {},
},
idKey:{
idKey: {
type: String,
default: 'id',
default: "id",
},
//限时折扣
limitDiscount: {
@@ -53,4 +65,11 @@ const props = defineProps({
});
</script>
<style scoped lang="scss"></style>
<style lang="scss">
.old-price {
color: #999;
font-size: 24rpx;
text-decoration: line-through;
margin-left: 8rpx;
}
</style>