Commit e743c4af authored by spc's avatar spc

fixed

parent 3add8d9d
......@@ -55,23 +55,23 @@
<view v-else-if="item.type === 'display'" class="form-input-box">
<view class="form-input" style="color: #222">{{
formData[item.name] || item.placeholder
}}</view>
}}</view>
</view>
<view v-else-if="item.type === 'display-obj'" class="form-input-box">
<view class="form-input" style="color: #222">{{
getLabelByValue(item, formData[item.name])
}}</view>
}}</view>
</view>
<!-- 选择器类型 -->
<picker-custom v-else-if="item.type === 'picker'" :mode="item.mode" :range="item.range" :value="item.mode === 'date'
? formData[item.name]
: getPickerIndex(item)
? formData[item.name]
: getPickerIndex(item)
" :onPickerChange="(e) => onPickerChange(e, item.name)"
:onLayerVisibleChange="(e) => (pageStatus.btnStatus = !e)" :onStatusChange="onDateStatusChange">
<view class="form-input-box">
<view class="form-input">{{
getLabelByValue(item, formData[item.name]) || item.placeholder
}}</view>
}}</view>
<image class="form-input-icon" :src="$baseUrl + 'person/icon_arrow_yellow_right.png'" />
</view>
</picker-custom>
......@@ -280,15 +280,7 @@ const formItems = ref([
range: babyGenderMap.map((i) => i.label),
mode: "custom",
},
{
label: "喂养方式",
name: "feedingType",
required: false,
placeholder: "未选择",
type: "picker",
range: ["奶粉喂养", "母乳喂养", "母乳奶粉混合喂养"],
mode: "custom",
},
{ label: "喂养方式", name: "feedingType", required: true, placeholder: "未选择", type: "picker", range: ["奶粉喂养", "母乳喂养", "母乳奶粉混合喂养"], mode: "custom", },
{
label: "孕周",
name: "gestationalWeeks",
......@@ -543,7 +535,7 @@ const checkAndUpdateTaskResult = async () => {
await integralStore.queryTodoResultServer();
console.log('queryTodoResult:', integralStore.queryTodoResult);
if(integralStore.queryTodoResult?.success && integralStore.queryTodoResult?.data?.length > 0) {
if (integralStore.queryTodoResult?.success && integralStore.queryTodoResult?.data?.length > 0) {
globalStore.isShowTaskComplete = true;
globalStore.taskCompletePoints = integralStore.queryTodoResult.data[0]?.actualCredits;
globalStore.taskCompleteTitle = integralStore.queryTodoResult.data[0]?.taskName;
......
......@@ -4,7 +4,7 @@
<view class="form-item">
<text class="label">收货人</text>
<input class="input" v-model="formData.name" placeholder="请输入收货人姓名" maxlength="30"
@input="limitNameInput" />
@input="limitNameInput" placeholder-style="color: #BFBFBF;" />
<view class="wechat-import" @tap="importFromWechat">
<image class="wechat-icon" :src="$baseUrl + 'homepage/Q3Res/wechatIcon.png'" mode="aspectFit">
</image>
......@@ -14,14 +14,15 @@
<view class="form-item">
<text class="label">手机号码</text>
<input class="input" :class="{ 'error': phoneError }" v-model="formData.phone" placeholder="请输入手机号码"
type="number" maxlength="11" @input="validatePhone" />
type="number" maxlength="11" @input="validatePhone" placeholder-style="color: #BFBFBF;" />
<text v-if="phoneError" class="error-text">请输入正确的手机号码</text>
</view>
<view class="form-item">
<text class="label">所在地区</text>
<view class="region-select" @tap="showRegionPicker">
<text class="region-text">{{ formData.region || '请选择省/市/区' }}</text>
<text class="region-text" :class="{ 'placeholder-color': !formData.region }">{{ formData.region ||
'请选择省/市/区' }}</text>
<image class="arrow" :src="$baseUrl + 'homepage/Q3Res/rightArrowBtn.png'" mode="aspectFit" />
</view>
</view>
......@@ -29,20 +30,20 @@
<view class="form-item">
<text class="label">详细地址</text>
<input class="textarea" v-model="formData.detailAddress" placeholder="请填写详细地址" maxlength="100"
@input="limitDetailAddress" />
@input="limitDetailAddress" placeholder-style="color: #BFBFBF;" />
<text class="char-count">{{ formData.detailAddress.length }}/100</text>
</view>
<view class="form-item">
<text class="label">门牌号</text>
<input class="input" v-model="formData.houseNumber" placeholder="街道、门牌号等" maxlength="50"
@input="limitHouseNumber" />
@input="limitHouseNumber" placeholder-style="color: #BFBFBF;" />
<text class="char-count">{{ formData.houseNumber.length }}/50</text>
</view>
<view class="default-switch" @tap="toggleDefault">
<view class="default-switch">
<text class="switch-text">设为默认地址</text>
<view class="switch" :class="{ 'active': formData.isDefault }">
<view class="switch" @tap="toggleDefault" :class="{ 'active': formData.isDefault }">
<view class="switch-dot" :class="{ 'active': formData.isDefault }"></view>
</view>
</view>
......@@ -356,13 +357,13 @@ export default {
isItemSelected(item, index) {
switch (this.currentLevel) {
case 0:
return this.selectedProvince && this.selectedProvince.id === item.code;
return this.selectedProvince && this.selectedProvince.code === item.code;
case 1:
return this.selectedCity && this.selectedCity.id === item.code;
return this.selectedCity && this.selectedCity.code === item.code;
case 2:
return this.selectedDistrict && this.selectedDistrict.id === item.code;
return this.selectedDistrict && this.selectedDistrict.code === item.code;
case 3:
return this.selectedStreet && this.selectedStreet.id === item.code;
return this.selectedStreet && this.selectedStreet.code === item.code;
default:
return false;
}
......@@ -398,9 +399,9 @@ export default {
this.districts = [];
this.streets = [];
// 更新picker值并加载城市
// 更新picker值并加载城市,使用code而不是id
this.pickerValue = [provinceIndex, 0, 0, 0];
await this.loadCities(this.selectedProvince.id);
await this.loadCities(this.selectedProvince.code);
}
// 城市变化
......@@ -412,9 +413,9 @@ export default {
this.districts = [];
this.streets = [];
// 更新picker值并加载区县
// 更新picker值并加载区县,使用code而不是id
this.pickerValue = [provinceIndex, cityIndex, 0, 0];
await this.loadDistricts(this.selectedCity.id);
await this.loadDistricts(this.selectedCity.code);
}
// 区县变化
......@@ -424,9 +425,9 @@ export default {
this.selectedStreet = null;
this.streets = [];
// 更新picker值并加载街道
// 更新picker值并加载街道,使用code而不是id
this.pickerValue = [provinceIndex, cityIndex, districtIndex, 0];
await this.loadStreets(this.selectedDistrict.id);
await this.loadStreets(this.selectedDistrict.code);
}
// 街道变化
......@@ -682,7 +683,7 @@ export default {
uni.showToast({
title: '已设为默认地址',
icon: 'success'
icon: 'none'
});
} catch (error) {
console.error('设置默认地址失败:', error);
......@@ -946,17 +947,14 @@ export default {
<style scoped>
.address-edit-container {
padding-bottom: 200rpx;
/* background-color: #F8F8F8; */
min-height: 100vh;
background: var(--B10, #FAFAFA);
top: 0;
height: 100vh;
}
.form-container {
padding: 10rpx;
/* background-color: #FFFFFF; */
border-radius: 20rpx;
margin: 20rpx;
background: var(--B10, #FAFAFA);
overflow: hidden;
}
......@@ -975,34 +973,42 @@ export default {
font-size: 24rpx;
color: #999999;
margin-left: 20rpx;
margin-right: 40rpx;
}
.form-item {
display: flex;
align-items: center;
margin-bottom: 0;
padding: 20rpx;
padding: 0 20rpx;
height: 104rpx;
border-bottom: 1rpx solid #f0f0f0;
width: 100%;
box-sizing: border-box;
}
.label {
font-size: 30rpx;
color: #333333;
font-size: 26rpx;
color: #000;
width: 120rpx;
flex-shrink: 0;
margin-right: 20rpx;
margin-left: 54rpx;
margin-right: 80rpx;
font-weight: 400;
}
.input {
flex: 1;
font-size: 30rpx;
font-size: 24rpx;
color: #000;
padding: 0;
border: none;
outline: none;
}
/* 占位符样式已通过placeholder-style属性设置 */
.wechat-import {
display: flex;
align-items: center;
......@@ -1019,7 +1025,7 @@ export default {
.textarea {
flex: 1;
font-size: 30rpx;
font-size: 24rpx;
min-height: 80rpx;
padding: 0;
resize: none;
......@@ -1039,28 +1045,35 @@ export default {
}
.region-text {
font-size: 30rpx;
color: #999999;
font-size: 24rpx;
color: #000;
}
.region-text.placeholder-color {
color: #BFBFBF;
}
.arrow {
width: 14rpx;
height: 23rpx;
margin-right: 40rpx;
}
.default-switch {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx;
padding: 0 20rpx;
height: 104rpx;
border-bottom: 1rpx solid #f0f0f0;
width: 100%;
box-sizing: border-box;
}
.switch-text {
font-size: 30rpx;
color: #333333;
font-size: 26rpx;
color: #000;
margin-left: 54rpx;
}
.switch {
......@@ -1069,6 +1082,7 @@ export default {
background-color: #E5E5E5;
border-radius: 48rpx;
position: relative;
margin-right: 40rpx;
transition: background-color 0.3s ease;
}
......
......@@ -190,7 +190,7 @@ export default {
if (this.isSubmitting) return;
// 检查地址数量限制
if (this.addressList.length >= 21) {
if (this.addressList.length >= 20) {
uni.showToast({
title: '地址添加已经达到上限啦~',
icon: 'none',
......
......@@ -50,7 +50,7 @@
<text class="detail-title">详情信息</text>
<view class="detail-banner" v-if="goodsData.goodsContent">
<rich-text style="width: 100%; /* 或设置为具体的像素值 */ overflow-x: hidden;" class="banner-text"
:nodes="formatRichText(goodsData.goodsContent)"></rich-text>
:nodes="formatRichText(goodsData.goodsContent)"></rich-text>
</view>
</view>
</view>
......@@ -86,7 +86,7 @@
</view>
<view class="product-details">
<text class="product-points">{{ goodsData.points }}{{ goodsData.creditsTypeName || '积分'
}}</text>
}}</text>
<text class="product-stock">库存 {{ formatCount(goodsData.exchangeCount) }}</text>
</view>
</view>
......@@ -109,7 +109,7 @@
<text class="quantity-label">选择数量 <text class="limit-text" v-if="goodsData.goodsLimit">(限购{{
goodsData.goodsLimit }}件)</text></text>
<view class="quantity-selector">
<image class="quantity-bg" :src="$baseUrl + 'homepage/Q3Res/objectSelectConBg.png'"
<image class="quantity-bg" :src="$baseUrl + 'homepage/Q3Res/objectSelectConBg2.png'"
mode="aspectFill"></image>
<view class="quantity-btn " @click="decreaseQuantity" :disabled="quantity <= 1">-</view>
<text class="quantity-value">{{ quantity }}</text>
......@@ -599,16 +599,16 @@ export default {
};
return levelMap[memberLevelName] || 1;
},
// 富文本格式化处理函数
formatRichText(html) {
let newContent = html.replace(/<img[^>]*>/gi, function(match, capture) {
let newContent = html.replace(/<img[^>]*>/gi, function (match, capture) {
match = match.replace(/style="[^"]+"/gi, '').replace(/style='[^']+'/gi, '');
match = match.replace(/width="[^"]+"/gi, '').replace(/width='[^']+'/gi, '');
match = match.replace(/height="[^"]+"/gi, '').replace(/height='[^']+'/gi, '');
return match;
});
newContent = newContent.replace(/style="[^"]+"/gi, function(match, capture) {
newContent = newContent.replace(/style="[^"]+"/gi, function (match, capture) {
match = match.replace(/width:[^;]+;/gi, 'max-width:100%;').replace(/width:[^;]+;/gi, 'max-width:100%;');
return match;
});
......@@ -841,16 +841,19 @@ export default {
break;
case 'canExchange':
default:
message = '可以兑换';
// message = '可以兑换';
break;
}
}
uni.showToast({
title: message,
icon: 'none',
duration: 2000
});
if (message) {
uni.showToast({
title: message,
icon: 'none',
duration: 2000
});
}
},
// 关闭规格选择弹窗
......@@ -1493,8 +1496,8 @@ page {
}
.service-icon {
width: 60rpx;
height: 60rpx;
width: 96rpx;
height: 96rpx;
}
.exchange-btn {
......@@ -1713,7 +1716,7 @@ page {
font-size: 40rpx;
font-weight: bold;
display: flex;
align-items: center;
/* align-items: center; */
justify-content: center;
z-index: 2;
border-right: none;
......
......@@ -83,10 +83,7 @@ export default {
doTerminate().then(res => {
uni.hideLoading();
if (res.ok) {
uni.showToast({
title: '注销申请已提交',
icon: 'success'
});
// 可以跳转到登录页面或首页
setTimeout(() => {
uni.reLaunch({
......
......@@ -26,18 +26,26 @@
</view>
</view>
</view>
<text class="address-arrow">{{ ">" }}</text>
<!-- <view class="arrow-icon">
<image :src="$baseUrl + 'homepage/Q3Res/rightArrowBtn.png'" mode="aspectFill"></image>
</view> -->
</view>
<!-- 模块1: 商品信息和券码 -->
<view class="module-product-info">
<view class="product-detail">
<view class="product-image">
<!-- 优先使用后端返回的goodsImage -->
<image v-if="orderData.goodsImage && orderData.goodsImage.length > 0"
:src="orderData.goodsImage[0]" mode="aspectFill" class="product-img" />
<!-- 使用goodsIcon作为备选图片源 -->
<image v-else-if="orderData.goodsIcon" :src="orderData.goodsIcon" mode="aspectFill"
class="product-img" />
<!-- 其次使用二维码图片(针对虚拟商品) -->
<image
v-else-if="orderData.productType === 'virtual' && orderData.coupon && orderData.coupon.qrImage"
:src="orderData.coupon.qrImage" mode="aspectFill" class="product-img" />
<!-- 最后显示占位文本 -->
<text v-else class="image-placeholder">{{ orderData.productType === 'virtual' ? '优惠券' : '商品'
}}</text>
</view>
......@@ -58,28 +66,30 @@
<view
v-if="orderData.virtualType === 'card' && orderData.coupon && orderData.coupon.cards && orderData.coupon.cards.length > 0 && orderData.coupon.cards[0].code"
class="coupon-code-item">
<!-- 当只有code没有pwd时显示券码,否则显示卡号 -->
<text class="coupon-label">{{ orderData.coupon.cards[0].pwd ? '卡号' : '券码' }}</text>
<view class="coupon-code-content">
<text class="coupon-code">{{ orderData.coupon.cards[0].code }}</text>
<text class="copy-btn" @click="copyCouponCode(orderData.coupon.cards[0].code)">复制</text>
</view>
<!-- 卡密展示 - 如果存在pwd字段,换行显示 -->
<view v-if="orderData.coupon.cards[0].pwd" class="pwd-section">
<!-- 当只有code没有pwd时显示券码,否则显示卡号 - label和value在同一行 -->
<div class="coupon-field">
<text class="coupon-label">{{ orderData.coupon.cards[0].pwd ? '卡号' : '券码' }}</text>
<div class="coupon-code-content">
<text class="coupon-code">{{ orderData.coupon.cards[0].code }}</text>
<text class="copy-btn" @click="copyCouponCode(orderData.coupon.cards[0].code)">复制</text>
</div>
</div>
<!-- 卡密展示 - 如果存在pwd字段,在独立行中显示 -->
<div v-if="orderData.coupon.cards[0].pwd" class="coupon-field">
<text class="coupon-label">卡密</text>
<view class="coupon-code-content">
<div class="coupon-code-content">
<text class="coupon-code">{{ orderData.coupon.cards[0].pwd }}</text>
<text class="copy-btn" @click="copyCouponCode(orderData.coupon.cards[0].pwd)">复制</text>
</view>
</view>
</div>
</div>
</view>
<!-- 过期时间 -->
<view v-if="orderData.expireTime" class="expire-time-item">
<div v-if="orderData.expireTime" class="coupon-field">
<text class="coupon-label">{{ orderData.virtualType === 'coupon' ? '优惠券时间' : '过期时间' }}</text>
<text class="expire-time">{{ orderData.expireTime }}</text>
</view>
</div>
</view>
</view>
......@@ -141,27 +151,36 @@
<!-- 物流信息 - 仅实物商品且已发货/已完成时显示 -->
<view
v-if="orderData.productType === 'physical' && (orderData.status === 'shipped' || orderData.status === 'completed' || orderData.status === '已发货' || orderData.status === '已完成')"
class="module-logistics" @click="viewLogistics">
<view class="logistics-content">
v-if="orderData.productType === 'physical' && (orderData.status === 'shipped' || orderData.status === 'completed' || orderData.status === '已发货' || orderData.status === '已完成') && orderData.logisticsList && orderData.logisticsList.length > 0"
class="module-logistics">
<view v-for="(logistics, index) in orderData.logisticsList" :key="index" class="logistics-content"
@click="viewLogistics(index)">
<!-- 显示包裹序号 -->
<view v-if="orderData.logisticsList.length > 1" class="package-number">
<text>包裹 {{ index + 1 }}</text>
</view>
<view class="logistics-row">
<text class="logistics-label">物流公司</text>
<text class="logistics-value">{{ orderData.logisticsCompany }}</text>
<text class="logistics-value">{{ logistics.company }}</text>
</view>
<view class="logistics-row">
<text class="logistics-label">物流单号</text>
<view class="logistics-right">
<text class="logistics-value">{{ orderData.trackingNumber }}</text>
<text class="copy-btn" @click.stop="copyTrackingNumber">复制</text>
<text class="logistics-value">{{ logistics.trackingNumber }}</text>
<text class="copy-btn" @click.stop="copyTrackingNumber(logistics.trackingNumber)">复制</text>
</view>
</view>
<text class="arrow-icon">{{ ">" }}</text>
<view class="arrow-icon">
<image class="arrow-image" :src="$baseUrl + 'homepage/Q3Res/rightArrowBtn.png'"
mode="aspectFill"></image>
</view>
</view>
</view>
<!-- 操作按钮 - 实物订单退货按钮在右下角 -->
<view v-if="showActionButton" class="action-container">
<view v-if="orderData.productType === 'virtual' && orderData.virtualType === 'coupon'" class="action-btn btn-use" @click="handleAction">
<view v-if="orderData.productType === 'virtual' && orderData.virtualType === 'coupon'"
class="action-btn btn-use" @click="handleAction">
<image :src="$baseUrl + 'homepage/Q3Res/orderDetailToUseBtn.png'" mode="aspectFill"></image>
</view>
<button v-else class="action-btn" :class="{
......@@ -216,6 +235,7 @@ export default {
return {
// 订单数据
orderData: {
logisticsList: [],
productType: '', // 'physical' | 'virtual'
virtualType: '', // 'coupon' | 'card' - 区分优选券和异业卡券
status: '', // 实物: '等待商家发货' | '已发货' | '已完成' | 虚拟: '交易成功' | '交易关闭'
......@@ -527,10 +547,38 @@ export default {
this.orderData.actualPayment = `${creditsValue}${creditsType}`;
// 设置物流信息(仅实物商品)
if (this.orderData.productType === 'physical' && this.orderData.express && Object.keys(this.orderData.express).length > 0) {
this.orderData.logisticsCompany = this.orderData.express.company || '';
// 优先从trackingNumber获取,如果不存在则尝试从order_no获取
this.orderData.trackingNumber = this.orderData.express.trackingNumber || this.orderData.express.order_no || '';
if (this.orderData.productType === 'physical') {
// 处理多物流信息
if (this.orderData.express && Object.keys(this.orderData.express).length > 0) {
// 检查是否有多个物流信息
if (this.orderData.express.logisticsList && Array.isArray(this.orderData.express.logisticsList) && this.orderData.express.logisticsList.length > 0) {
// 有多物流列表
this.orderData.logisticsList = this.orderData.express.logisticsList.map(item => ({
company: item.company || '',
trackingNumber: item.trackingNumber || item.order_no || ''
}));
} else if (this.orderData.express.trackingNumber || this.orderData.express.order_no) {
// 只有单个物流信息
this.orderData.logisticsList = [{
company: this.orderData.express.company || '',
trackingNumber: this.orderData.express.trackingNumber || this.orderData.express.order_no || ''
}];
} else {
// 兼容旧数据格式或逗号分隔的物流信息
const companies = (this.orderData.logisticsCompany || '').split(',');
const trackingNumbers = (this.orderData.express.trackingNumber || this.orderData.express.order_no || this.orderData.trackingNumber || '').split(',');
this.orderData.logisticsList = [];
for (let i = 0; i < Math.max(companies.length, trackingNumbers.length); i++) {
this.orderData.logisticsList.push({
company: companies[i] || companies[0] || '',
trackingNumber: trackingNumbers[i] || ''
});
}
}
} else {
this.orderData.logisticsList = [];
}
}
// 设置有效期和使用说明(非实物商品)
......@@ -612,7 +660,7 @@ export default {
success: () => {
uni.showToast({
title: '订单编号已复制',
icon: 'success'
icon: 'none'
});
}
});
......@@ -627,13 +675,13 @@ export default {
},
// 复制物流单号
copyTrackingNumber() {
copyTrackingNumber(trackingNumber) {
uni.setClipboardData({
data: this.orderData.trackingNumber,
data: trackingNumber,
success: () => {
uni.showToast({
title: '物流单号已复制',
icon: 'success'
icon: 'none'
});
}
});
......@@ -646,17 +694,18 @@ export default {
success: () => {
uni.showToast({
title: '券码已复制',
icon: 'success'
icon: 'none'
});
}
});
},
// 查看物流详情
viewLogistics() {
// 跳转到物流页面并传递订单ID
viewLogistics(index) {
const logistics = this.orderData.logisticsList[index];
// 跳转到物流页面并传递订单ID和物流信息
uni.navigateTo({
url: '/v3/logisticsPage/logisticsPage?orderId=' + (this.orderData.orderNo || this.orderData.orderNumber)
url: `/v3/logisticsPage/logisticsPage?orderId=${this.orderData.orderNo || this.orderData.orderNumber}&company=${encodeURIComponent(logistics.company)}&trackingNumber=${encodeURIComponent(logistics.trackingNumber)}`
});
},
......@@ -691,7 +740,7 @@ export default {
if (response.ok && response.data) {
uni.showToast({
title: '申请退货成功',
icon: 'success'
icon: 'none'
});
// 刷新订单状态
this.loadOrderDetail(this.orderData.orderNo || this.orderData.orderNumber);
......@@ -734,7 +783,7 @@ export default {
success: () => {
uni.showToast({
title: '订单编号已复制',
icon: 'success'
icon: 'none'
});
}
});
......@@ -782,13 +831,13 @@ export default {
top: 0;
left: 0;
width: 100%;
height: 200rpx;
height: 240rpx;
background: linear-gradient(180deg, #ECC990 0%, rgba(211, 164, 88, 0) 100%);
}
/* 订单状态 */
.status-section {
padding: 20rpx 80rpx;
padding: 20rpx 60rpx;
display: flex;
align-items: center;
position: relative;
......@@ -798,14 +847,14 @@ export default {
}
.status-icon {
width: 44rpx;
height: 44rpx;
width: 34rpx;
height: 34rpx;
margin-right: 20rpx;
flex-shrink: 0;
}
.status-text {
font-size: 36rpx;
font-size: 28rpx;
font-weight: bold;
color: #fff;
flex-shrink: 0;
......@@ -824,7 +873,7 @@ export default {
}
.failure-reason {
font-size: 26rpx;
font-size: 24rpx;
color: #fff;
margin-left: 20rpx;
flex-shrink: 0;
......@@ -881,11 +930,7 @@ export default {
color: #666;
}
.address-arrow {
font-size: 32rpx;
color: #999;
margin-left: 20rpx;
}
/* 商品详情 - 现在是模块2的一部分 */
.product-section {
......@@ -898,8 +943,8 @@ export default {
}
.product-image {
width: 100rpx;
height: 100rpx;
width: 180rpx;
height: 180rpx;
background-color: #f0e6d2;
border-radius: 10rpx;
display: flex;
......@@ -925,7 +970,7 @@ export default {
}
.product-name {
font-size: 30rpx;
font-size: 28rpx;
color: #333;
line-height: 1.4;
margin-bottom: 12rpx;
......@@ -959,13 +1004,13 @@ export default {
}
.product-price {
font-size: 34rpx;
font-size: 32rpx;
color: #d3a458;
font-weight: bold;
}
.product-quantity {
font-size: 26rpx;
font-size: 24rpx;
color: #999;
}
......@@ -982,13 +1027,14 @@ export default {
}
.payment-label {
font-size: 30rpx;
color: #333;
font-size: 28rpx;
color: var(--B700, #1C1C1C);
font-weight: bold;
}
.payment-value {
font-size: 30rpx;
color: #333;
font-size: 28rpx;
color: #A8A8A8;
}
.payment-total {
......@@ -1003,6 +1049,7 @@ export default {
font-size: 30rpx;
color: #333;
margin-right: 10rpx;
font-weight: bold;
}
.total-value {
......@@ -1020,7 +1067,7 @@ export default {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20rpx;
margin-bottom: 30rpx;
}
.info-row:last-child {
......@@ -1028,8 +1075,9 @@ export default {
}
.info-label {
font-size: 30rpx;
font-size: 28rpx;
color: #333;
font-weight: bold;
}
.info-right {
......@@ -1039,8 +1087,8 @@ export default {
}
.info-value {
font-size: 30rpx;
color: #666;
font-size: 28rpx;
color: #A8A8A8;
}
/* 已统一到上方的.copy-btn样式 */
......@@ -1059,9 +1107,32 @@ export default {
.module-logistics {
background-color: #fff;
padding: 30rpx 20rpx;
border-radius: 20rpx;
margin-bottom: 20rpx;
padding: 20rpx;
}
.logistics-content {
position: relative;
padding: 10rpx 0;
}
.logistics-content:not(:last-child) {
border-bottom: 1rpx solid #f0f0f0;
margin-bottom: 20rpx;
}
.package-number {
background-color: #f5f5f5;
padding: 8rpx 20rpx;
border-radius: 20rpx;
margin-bottom: 16rpx;
display: inline-block;
}
.package-number text {
font-size: 24rpx;
color: #666;
}
.logistics-row {
......@@ -1069,7 +1140,8 @@ export default {
align-items: center;
justify-content: space-between;
margin-bottom: 20rpx;
width: 100%;
/* 限制最大宽度,为右箭头留出空间 */
max-width: calc(100% - 60rpx);
}
.logistics-row:last-child {
......@@ -1079,26 +1151,44 @@ export default {
.logistics-label {
font-size: 30rpx;
color: #333;
/* 固定标签宽度,确保对齐 */
width: 140rpx;
font-weight: bold;
}
.logistics-right {
display: flex;
align-items: center;
gap: 20rpx;
/* 内容区域不换行 */
flex-shrink: 0;
}
.logistics-value {
font-size: 30rpx;
color: #666;
/* 限制值的最大宽度,防止过长 */
max-width: 400rpx;
/* 文本超出时省略 */
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.arrow-icon {
font-size: 32rpx;
color: #999;
position: absolute;
right: 30rpx;
right: 10rpx;
top: 50%;
transform: translateY(-50%);
/* 确保箭头在最上层 */
z-index: 1;
}
.arrow-icon image {
width: 14rpx;
height: 23rpx;
}
/* 操作按钮容器 */
......@@ -1108,8 +1198,9 @@ export default {
bottom: 0;
left: 0;
right: 0;
height: 180rpx;
background-color: #fff;
padding: 80rpx 30rpx;
padding: 0rpx 30rpx;
box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.1);
z-index: 100;
/* 虚拟商品按钮居中显示,实物商品按钮推到右侧 */
......@@ -1117,6 +1208,8 @@ export default {
justify-content: center;
}
/* 实物商品按钮容器特殊样式 */
.action-container:has(.btn-refund) {
justify-content: flex-end;
......@@ -1127,26 +1220,26 @@ export default {
width: 100%;
height: 88rpx;
border-radius: 44rpx;
font-size: 32rpx;
font-weight: bold;
font-size: 30rpx;
font-weight: 500;
text-align: center;
}
/* 实物商品申请退货按钮样式 - 右下角 */
.action-btn.corner-btn {
width: 200rpx;
height: 80rpx;
border-radius: 40rpx;
width: 248rpx;
height: 74rpx;
border-radius: 50rpx;
background-color: #fff;
color: #333;
border: 1rpx solid #ddd;
color: #000;
border: 1rpx solid #000;
/* 调整位置,使其在右下角 */
position: fixed;
bottom: 30rpx;
right: 30rpx;
right: 26rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
/* 确保按钮显示在客服按钮上方 */
z-index: 101;
margin-top: 30rpx;
}
/* 去使用图片按钮样式 */
......@@ -1173,31 +1266,34 @@ export default {
/* 券码和过期时间样式 - 现在是模块1的一部分 */
.coupon-section {
margin-top: 30rpx;
padding-top: 30rpx;
border-top: 1rpx solid #f0f0f0;
/* padding-top: 30rpx; */
/* border-top: 1rpx solid #f0f0f0; */
}
.coupon-code-item {
margin-bottom: 20rpx;
}
.expire-time-item {
.coupon-field {
margin-bottom: 25rpx;
width: 100%;
padding: 0rpx;
/* background-color: #f5f5f5; */
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20rpx;
}
/* 卡号和卡密之间的间距 */
.pwd-section {
margin-top: 20rpx;
}
.coupon-label {
font-size: 28rpx;
color: #666;
color: #333;
text-align: left;
white-space: nowrap;
font-weight: 600;
margin-right: 20rpx;
}
.coupon-code-content {
......@@ -1215,27 +1311,34 @@ export default {
}
.coupon-code {
font-size: 26rpx;
color: #333;
font-size: 28rpx;
color: #A8A8A8;
letter-spacing: 2rpx;
}
.expire-time {
flex: 1;
font-size: 28rpx;
color: #666;
color: #A8A8A8;
text-align: right;
}
/* 复制按钮样式 - 统一调整为与图2一致 */
.copy-btn {
font-size: 26rpx;
color: #666;
font-size: 20rpx;
white-space: nowrap;
padding: 8rpx 24rpx;
border: 1rpx solid #ddd;
border-radius: 18rpx;
background-color: #f5f5f5;
color: #A8A8A8;
text-align: center;
font-style: normal;
font-weight: 500;
line-height: 32rpx;
border-radius: 24rpx;
border: 1px solid #A8A8A8;
width: 74rpx;
height: 32rpx;
flex-shrink: 0;
background: #FFF;
/* 120% */
}
/* 模块样式 */
......@@ -1260,7 +1363,7 @@ export default {
}
.section-title {
font-size: 30rpx;
font-size: 28rpx;
color: #333;
font-weight: bold;
margin-bottom: 24rpx;
......@@ -1270,7 +1373,7 @@ export default {
.instruction-content,
.instruction-text {
font-size: 28rpx;
color: #666;
color: #A8A8A8;
line-height: 44rpx;
}
......@@ -1315,38 +1418,44 @@ export default {
}
.modal-content {
background-color: #fff;
border-radius: 20rpx;
width: 80%;
max-width: 500rpx;
padding: 40rpx;
position: relative;
width: 546rpx;
height: 418rpx;
flex-shrink: 0;
border-radius: 38rpx;
background: linear-gradient(180deg, #FFE9C5 0%, #FFF 52.87%);
}
.modal-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
color: #D3A458;
text-align: center;
margin-bottom: 30rpx;
font-size: 40rpx;
font-style: normal;
font-weight: 600;
line-height: normal;
margin-top: 62rpx;
}
.modal-message {
font-size: 28rpx;
color: #666;
color: var(--B900, #000);
text-align: center;
line-height: 44rpx;
margin-bottom: 40rpx;
font-size: 28rpx;
font-style: normal;
font-weight: 400;
line-height: normal;
margin-top: 22rpx;
}
.modal-buttons {
display: flex;
justify-content: space-between;
gap: 30rpx;
gap: 20rpx;
margin-top: 70rpx;
justify-content: center;
}
.modal-btn {
height: 78rpx;
width: 220rpx !important;
height: 78rpx !important;
position: relative;
}
.modal-btn image {
......@@ -1355,10 +1464,11 @@ export default {
}
.cancel-btn {
margin-right: 20rpx;
border: none;
}
.confirm-btn {
border: none;
margin-left: 20rpx;
}
......@@ -1366,7 +1476,8 @@ export default {
font-size: 24rpx;
color: #999;
text-align: center;
margin-top: 20rpx;
line-height: 1.4;
margin-top: 40rpx;
}
.modal-close-btn {
......@@ -1378,9 +1489,4 @@ export default {
justify-content: center;
margin-top: 80rpx;
}
.modal-close-btn {
width: 56rpx;
height: 56rpx;
}
</style>
......@@ -50,20 +50,20 @@
<!-- 配送方式 -->
<view class="delivery-section">
<text class="delivery-label">配送方式</text>
<text class="delivery-label" style="font-weight: bold;">配送方式</text>
<text class="delivery-method">快递邮寄</text>
</view>
<!-- 订单备注 -->
<view class="notes-section">
<text class="notes-label">订单备注</text>
<text class="notes-label" style="font-weight: bold;">订单备注</text>
<text class="notes-hint">选填:对本次交易的说明(最多40字)</text>
<input class="notes-input" placeholder="请输入订单备注" maxlength="40" v-model="orderNotes" />
</view>
<!-- 订单汇总 -->
<view class="summary-section">
<text class="summary-label">{{ goodsInfo.quantity }}</text>
<text class="summary-label" style="font-weight: bold;">{{ goodsInfo.quantity }}</text>
<text class="summary-price">小计:{{ goodsInfo.points * goodsInfo.quantity }}{{
goodsInfo.creditsTypeName }}</text>
</view>
......@@ -79,7 +79,7 @@
<!-- 底部提交栏 -->
<view class="bottom-bar">
<view class="total-info">
<text class="total-label">商品积分</text>
<text class="total-label" style="font-weight: bold;">商品积分</text>
<text class="total-price">{{ goodsInfo.points * goodsInfo.quantity }}{{ goodsInfo.creditsTypeName
}}</text>
</view>
......@@ -155,35 +155,35 @@ import { jump, JumpType } from '../../utils';
export default {
data() {
return {
orderNotes: '',
// 订单来源子渠道
orderSubSource: '',
// 订单参数
orderParams: {},
priceData: null,
// 地址信息
selectedAddress: null,
hasAddress: false,
fullAddress: '',
recipientName: '',
recipientPhone: '',
// 商品信息
goodsInfo: {
name: '',
spec: '',
points: 0,
quantity: 1
},
// 商店信息
homeStore: null,
// 弹窗状态
showConfirmModal: false,
showAddressModal: false,
showSelectAddressModal: false,
// 用于防连点
isSubmitting: false
}
return {
orderNotes: '',
// 订单来源子渠道
orderSubSource: '',
// 订单参数
orderParams: {},
priceData: null,
// 地址信息
selectedAddress: null,
hasAddress: false,
fullAddress: '',
recipientName: '',
recipientPhone: '',
// 商品信息
goodsInfo: {
name: '',
spec: '',
points: 0,
quantity: 1
},
// 商店信息
homeStore: null,
// 弹窗状态
showConfirmModal: false,
showAddressModal: false,
showSelectAddressModal: false,
// 用于防连点
isSubmitting: false
}
},
onLoad(options) {
console.log('结算页面参数:', options);
......@@ -345,12 +345,12 @@ export default {
closeAddressModal() {
this.showAddressModal = false;
},
// 关闭选择地址提示弹窗
closeSelectAddressModal() {
this.showSelectAddressModal = false;
},
// 处理选择地址
handleGoSelectAddress() {
this.closeSelectAddressModal();
......@@ -578,34 +578,39 @@ export default {
}
.modal-content {
background-color: #fff;
border-radius: 30rpx;
padding: 40rpx;
width: 80%;
max-width: 600rpx;
box-sizing: border-box;
width: 546rpx;
height: 418rpx;
flex-shrink: 0;
border-radius: 38rpx;
background: linear-gradient(180deg, #FFE9C5 0%, #FFF 52.87%);
}
.modal-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
color: #D3A458;
text-align: center;
margin-bottom: 30rpx;
font-size: 40rpx;
font-style: normal;
font-weight: 600;
line-height: normal;
margin-top: 62rpx;
}
.modal-message {
font-size: 28rpx;
color: #666;
color: var(--B900, #000);
text-align: center;
margin-bottom: 40rpx;
line-height: 1.5;
font-size: 28rpx;
font-style: normal;
font-weight: 400;
line-height: normal;
margin-top: 22rpx;
}
.modal-buttons {
display: flex;
gap: 20rpx;
margin-bottom: 30rpx;
margin-top: 60rpx;
justify-content: center;
}
......@@ -634,6 +639,7 @@ export default {
color: #999;
text-align: center;
line-height: 1.4;
margin-top: 40rpx;
}
.modal-close-btn {
......@@ -697,11 +703,13 @@ export default {
margin-bottom: 10rpx;
display: block;
overflow: hidden;
font-weight: bold;
}
.address-text.no-address {
color: #999;
font-style: italic;
font-weight: 500;
}
.recipient-info {
......@@ -837,7 +845,7 @@ export default {
.delivery-label {
font-size: 28rpx;
color: #333;
color: #A8A8A8;
}
.delivery-method {
......@@ -862,7 +870,7 @@ export default {
.notes-hint {
font-size: 24rpx;
color: #999;
color: #A8A8A8;
margin-bottom: 10rpx;
margin-left: 20rpx;
display: inline-block;
......@@ -888,12 +896,13 @@ export default {
margin-bottom: 0;
display: flex;
align-items: center;
justify-content: space-between;
justify-content: flex-end;
}
.summary-label {
font-size: 28rpx;
color: #333;
margin-right: 20rpx;
}
.summary-price {
......@@ -909,7 +918,6 @@ export default {
right: 30rpx;
width: 96rpx;
height: 96rpx;
background-color: #D3A458;
border-radius: 50%;
display: flex;
align-items: center;
......@@ -919,8 +927,8 @@ export default {
}
.service-icon {
width: 60rpx;
height: 60rpx;
width: 96rpx;
height: 96rpx;
}
/* 底部提交栏 */
......@@ -943,13 +951,15 @@ export default {
width: 60%;
display: flex;
flex-direction: row;
margin-left: 20rpx;
margin-right: 20rpx;
align-items: center;
}
.total-label {
font-size: 24rpx;
color: #666;
color: #000;
font-weight: bold;
}
.total-price {
......@@ -965,11 +975,12 @@ export default {
height: 74rpx;
background-color: #D3A458;
color: #fff;
font-size: 28rpx;
font-size: 30rpx;
border-radius: 37rpx;
border: none;
line-height: 74rpx;
padding: 0;
font-weight: bold;
}
.submit-btn:active {
......
......@@ -2617,13 +2617,13 @@ export default {
.gold-coin {
position: absolute;
width: 167rpx;
height: 162rpx;
width: 333rpx;
height: 333rpx;
animation-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
.gold-coin-1 {
animation: goldCoinFly 1.5s ease-out 1;
animation: goldCoinFly 1.5s cubic-bezier(0.34, 1.56, 0.64, 1) 1s 1;
z-index: 5;
}
......@@ -2650,59 +2650,17 @@ export default {
}
}
/* 单个金币从中间飞向底部导航"我的"图标的动画 - 自然延续的曲线波动 */
/* 单个金币从上方中间飞向底部导航"我的"图标的动画 - 简化为贝塞尔曲线直线运动 */
@keyframes goldCoinFly {
0% {
transform: translate(0, 0) scale(1.3) rotate(0deg);
transform: translate(-50%, -50%) scale(1.3) rotate(0deg);
opacity: 1;
left: 50%;
top: 50%;
}
20% {
transform: translate(100rpx, 120rpx) scale(1.25) rotate(10deg);
opacity: 1;
left: 50%;
top: 50%;
}
40% {
transform: translate(160rpx, 280rpx) scale(1.2) rotate(15deg);
opacity: 1;
left: 50%;
top: 50%;
}
60% {
transform: translate(190rpx, 380rpx) scale(1.1) rotate(25deg);
opacity: 0.95;
left: 50%;
top: 50%;
}
70% {
transform: translate(200rpx, 420rpx) scale(0.9) rotate(30deg);
opacity: 0.8;
left: 50%;
top: 50%;
}
80% {
transform: translate(208rpx, 460rpx) scale(0.7) rotate(38deg);
opacity: 0.6;
left: 50%;
top: 50%;
}
90% {
transform: translate(215rpx, 500rpx) scale(0.3) rotate(42deg);
opacity: 0.3;
left: 50%;
top: 50%;
}
100% {
transform: translate(220rpx, 550rpx) scale(0) rotate(45deg);
transform: translate(145rpx, 480rpx) scale(0) rotate(45deg);
opacity: 0;
left: 50%;
top: 50%;
......
......@@ -191,8 +191,8 @@
buttonName: '隐私协议',
}" @click="handleHot" data-type="privacy"></view>
</view> -->
<RegisterLayer v-model="showRegisterLayer" @confirm="onRegisterConfirm" />
</view>
<RegisterLayer v-model="showRegisterLayer" @confirm="onRegisterConfirm" @cancel="onRegisterCancel" />
<!-- 生日弹窗 type 3 钻石、4 星光、5 星耀 -->
<!-- <popup-shengri v-if="isTip" type="3" @close="isTip = false"></popup-shengri> -->
......@@ -515,7 +515,13 @@ const handleEditProfile = (e) => {
}
};
const onRegisterConfirm = (data) => {
const onRegisterConfirm = async () => {
await pageCfgStore.fetchCfg();
// 只调用一次initData,loadMemberInfo已在initData内部处理
initData();
showRegisterLayer.value = false;
};
const onRegisterCancel = () => {
showRegisterLayer.value = false;
};
......@@ -650,7 +656,6 @@ const getRealtimePhoneNumber = async (e) => {
return;
}
await userStore.phoneCallback(e.detail, async () => {
showRegisterLayer.value = true;
// 简化回调,避免重复调用接口
showLoading();
await pageCfgStore.fetchCfg();
......@@ -689,6 +694,9 @@ const handleChangeBaby = (e) => {
showBabySwitcher.value = true;
};
async function onSelectBaby(baby) {
// 处理宝宝切换逻辑
showBabySwitcher.value = false;
......@@ -707,12 +715,8 @@ async function onSelectBaby(baby) {
}
function handleAddBabyInfoClick() {
md.sensorLogTake({
xcxClick: "我的页面点击",
pageName: "我的页面",
buttonName: "去添加宝宝信息",
});
navigateTo("/pages/person/person?type=add");
// 显示RegisterLayer弹窗
showRegisterLayer.value = true;
}
function onAddBaby() {
......@@ -1258,4 +1262,4 @@ defineExpose({});
}
}
}
</style>
</style>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment