评价中心/售后数据接入

This commit is contained in:
邝军华 2025-04-11 17:49:34 +08:00
parent 489cbb8b88
commit 45837db187
30 changed files with 1913 additions and 380 deletions

242
components/multi/multi.vue Normal file
View File

@ -0,0 +1,242 @@
<template>
<!-- 多规格组件弹框 -->
<uni-popup ref="multiPopup" type="bottom" @change="changeMulti">
<view class="multiPopup">
<view class="shop_open_close" @click="OpenCoupon()">
<image src="../../static/order/close.png" mode="widthFix"></image>
</view>
<view class="multishop">
<image class="multishop_img" src="http://mnse8q.natappfree.cc/crmebimage/public/content/2025/03/06/8b55b251f89942fbaac25f72143be0e15jg9vmswjy.png" mode="widthFix"></image>
<view class="multishop_text">
<view class="multishop_title"><text>蔡长青烟熏鸡肉沙拉调味沙拉210g</text></view>
<view class="multishop_price">14.90<text class="multishop_name">5.00</text></view>
</view>
</view>
<view class="multishop_list">
<view class="multishop_list_title">颜色</view>
<view class="multishop_list_item">
<view class="multishop_list_name multishop_list_arver">沙漠色</view>
<view class="multishop_list_name">黑色</view>
<view class="multishop_list_name">原色</view>
<view class="multishop_list_name">白色</view>
</view>
</view>
<view class="multishop_list">
<view class="multishop_list_title">容量</view>
<view class="multishop_list_item">
<view class="multishop_list_name multishop_list_arver">256GB</view>
<view class="multishop_list_name">512GB</view>
<view class="multishop_list_name">1TB</view>
</view>
</view>
<view style="height: 200rpx;"></view>
<view class="footer_multi">
<view class="multishop_amount">
<view class="multishop_name_amount">选数量</view>
<view class="multishop_data_edit">
<view class="multishop_data_edit_img border_l" @click="editAmount(1,item)">
<image class="multishop_data_edit_imgurl" src="https://zhkj1.oss-cn-shanghai.aliyuncs.com/zhscMerchant/minus.png" mode="widthFix"></image>
</view>
<view class="multishop_data_number">22</view>
<view class="multishop_data_edit_img border_r" @click="editAmount(2,item)">
<image class="multishop_data_edit_imgurl" src="https://zhkj1.oss-cn-shanghai.aliyuncs.com/zhscMerchant/add.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="footer_multi_btn">确定</view>
</view>
</view>
</uni-popup>
</template>
<script setup>
import { loads } from '@/utils/index.js'
import { frontproduct } from '@/server/api';
import { computed,ref,onMounted,defineEmits } from 'vue';
import { useCounterStore } from '@/store/counter'; // Pinia Store
import { storeToRefs } from 'pinia';//
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
import { skudetail,cartsave } from '@/server/api.js'
const counterStore = useCounterStore(); // 使 Store
//使piniastoreToRefs(使)
const { token } = storeToRefs(counterStore);
</script>
<style lang="scss">
//
.multiPopup{
background-color: #FFFFFF;
border-top-left-radius: 25rpx;
border-top-right-radius: 25rpx;
max-height: 800rpx;
overflow-y: auto;
position: relative;
.shop_open_close{
width: 80rpx;
height: 80rpx;
position: absolute;
top: 0;
right: 0;
display: flex;
align-items: center;
justify-content: center;
}
.shop_open_close image{
width: 45rpx;
height: 45rpx;
}
.multishop{
display: flex;
padding: 25rpx 25rpx 0rpx 25rpx;
.multishop_img{
width: 180rpx;
height: 180rpx;
border-radius: 10rpx;
}
.multishop_text{
width: 460rpx;
margin-left: 20rpx;
.multishop_title{
font-size: 28rpx;
color: #333;
font-weight: 500;
margin-top: 5rpx;
min-height: 115rpx;
}
.multishop_title text{
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.multishop_price{
font-size: 32rpx;
color: #FD3F3F;
font-weight: 500;
.multishop_name{
color: #999;
font-size: 23rpx;
text-decoration: line-through;
margin-left: 5rpx;
font-weight: 400;
}
.multishop_name::before{
content: "¥";
font-size: 20rpx;
margin-right: 5rpx;
}
}
.multishop_price::before{
content: "¥";
font-size: 24rpx;
margin-right: 5rpx;
}
}
}
.multishop_list{
padding: 25rpx 25rpx 0rpx 25rpx;
.multishop_list_title{
font-size: 28rpx;
color: #333;
font-weight: 500;
margin-bottom: 25rpx;
}
.multishop_list_item{
display: flex;
flex-wrap: wrap;
.multishop_list_name{
padding: 12rpx 35rpx 12rpx 35rpx;
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #333333;
background-color: #f6f6f6;
margin-right: 25rpx;
margin-bottom: 25rpx;
border:1px solid #f6f6f6;
}
.multishop_list_arver{
background-color: #FFD7D7;
border:1px solid #fd3f3f;
color: #fd3f3f;
}
}
}
.footer_multi{
position: fixed;
bottom: 0rpx;
width: 100%;
background-color: #FFFFFF;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
.multishop_amount{
display: flex;
align-items: center;
justify-content: space-between;
padding-left: 25rpx;
padding-right: 25rpx;
margin-top: 15rpx;
margin-bottom: 40rpx;
.multishop_name_amount{
font-size: 28rpx;
color: #333;
font-weight: 500;
}
.multishop_data_edit{
display: flex;
align-items: center;
justify-content: center;
.multishop_data_edit_img{
width: 55rpx;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
border-top: 1px solid #E9E9E9;
border-bottom: 1px solid #E9E9E9;
.multishop_data_edit_imgurl{
width: 25rpx;
height: 25rpx;
display: block;
}
}
.border_l{
border-left: 1px solid #E9E9E9;
border-top-left-radius: 50rpx;
border-bottom-left-radius: 50rpx;
}
.border_r{
border-right: 1px solid #E9E9E9;
border-top-right-radius: 50rpx;
border-bottom-right-radius: 50rpx;
}
}
.multishop_data_number{
width: 60rpx;
height: 50rpx;
font-size: 28rpx;
color: #333;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #E9E9E9;
}
}
.footer_multi_btn{
margin: 0 28rpx 0 28rpx;
height:84rpx;
background-color: #FD3F3F;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
color: #FFFFFF;
border-radius: 50rpx;
}
}
</style>

View File

@ -124,10 +124,7 @@
}
shopList.value = shopList.value.concat(data.list);
}).catch(({message}) => {
uni.showModal({
content:message,
showCancel: false
})
decs.value = `—— ${message||'网络异常'} ——`;
})
}
@ -173,6 +170,10 @@
loads('', true)
return skudetail(id).then(({data}) => {
if(specTypes){
uni.hideLoading()
}else{
const { id,productId } = data.productValue.默认;

View File

@ -2,50 +2,64 @@
<view class="main">
<view class="cont flex">
<view class="cont_order_type">
<view class="cont_order_type_name">已完成</view>
<view class="cont_order_type_desc">感谢您的反馈</view>
<view class="cont_order_type_name">{{assDetail.statustext}}</view>
<view class="cont_order_type_desc">{{assDetail.refundVerifyFailReason}}</view>
</view>
<view class="cont_service">
<image class="cont_service_img" src="../../static/service.png" mode="widthFix"></image>
<view class="cont_service_name">联系客服</view>
</view>
</view>
<view class="cont">
<!-- <view class="cont">
<view class="cont_title">售后进度</view>
<view class="cont_step">
<uni-steps :options="step" active-color="#FF0000" direction="column" :active="active"></uni-steps>
</view>
</view>
</view> -->
<view class="cont paddom">
<view class="cont_title cont_border">售后明细</view>
<view class="cont_shop">
<view class="cont_shop" v-for="(item,index) in returnInfoList" :key="index">
<view class="cont_shop_img">
<image class="cont_shop_imgUrl" src="../../static/Mask.png" mode="widthFix"></image>
<image class="cont_shop_imgUrl" :src="item.image" mode="widthFix"></image>
</view>
<view class="cont_shop_text">
<view class="cont_shop_title">糖醋排骨</view>
<view class="cont_shop_price">实付:<text class="cont_shop_price_f">5.98</text></view>
<view class="cont_shop_desc">实付单价:<text class="cont_shop_desc_price">5.98</text> <text class="cont_shop_desc_num">数量:1</text></view>
<view class="cont_shop_title">{{item.storeName}}</view>
<!-- <view class="cont_shop_price">实付:<text class="cont_shop_price_f">5.98</text></view> -->
<view class="cont_shop_desc">
<!-- 实付单价:<text class="cont_shop_desc_price">5.98</text> -->
<text class="cont_shop_desc_num">退款数量:{{item.returnNum}}</text>
</view>
</view>
</view>
<view class="cont_shop_item">
<view class="cont_shop_item_name">售后数量</view>
<view class="cont_shop_item_value">1</view>
<view class="cont_shop_item_name">售后数量</view>
<view class="cont_shop_item_value">{{assDetail.returnNum}}</view>
</view>
<view class="cont_shop_item">
<view class="cont_shop_item_name">退款金额</view>
<view class="cont_shop_item_value">已退<text class="cont_shop_item_value_price">5.98</text></view>
<view class="cont_shop_item_value"><text class="cont_shop_item_value_price">{{assDetail.returnAmount}}</text></view>
</view>
</view>
<view class="cont paddom">
<view class="cont_title cont_border">售后订单信息</view>
<view class="cont_shop_item">
<view class="cont_shop_item" @click="copyText()">
<view class="cont_shop_item_name">售后单号</view>
<view class="cont_shop_item_value"><text class="cont_shop_item_copy">复制</text>35758859599447</view>
<view class="cont_shop_item_value"><text class="cont_shop_item_copy">复制</text>{{assDetail.code}}</view>
</view>
<view class="cont_shop_item">
<view class="cont_shop_item_name">申请时间</view>
<view class="cont_shop_item_value">2025/06/09 20:13</view>
<view class="cont_shop_item_value">{{assDetail.createTime}}</view>
</view>
<view class="cont_shop_item">
<view class="cont_shop_item_name">退款原因</view>
<view class="cont_shop_item_value">{{assDetail.returnReason}}</view>
</view>
<view class="cont_shop_item" v-if="returnImageList.length">
<view class="cont_shop_item_name">退款凭证</view>
<view class="cont_shop_item_value"></view>
</view>
<view class="cont_shop_img" v-if="returnImageList.length">
<image v-for="(item,index) in returnImageList" :key="index" class="cont_shop_img_url" :src="item" mode="aspectFill" @click="previewImage(i)"></image>
</view>
</view>
<view style="height: 200rpx;"></view>
@ -53,23 +67,96 @@
</template>
<script setup>
import { loads } from '@/utils/index.js'
import { computed,ref,onMounted,onUnmounted,getCurrentInstance,nextTick } from 'vue';
import { useCounterStore } from '@/store/counter'; // Pinia Store
import { storeToRefs } from 'pinia';//
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
import { returngetApplyRecord } from "@/server/api.js"
const counterStore = useCounterStore(); // 使 Store
const { proxy } = getCurrentInstance();
//使piniastoreToRefs(使)
const {statusHeight,headerHeight,statusBartop } = storeToRefs(counterStore);
const active = ref(0);
const id = ref("");
const assDetail = ref({});
const returnInfoList = ref([]);
const returnImageList = ref([])
const step = ref([
{title:'售后申请已提交成功,客服将全力为您解决问题,请您耐心等待',desc:'2025/06/29 20:15'},
{title:'售后申请已被受理,客服正在加速为您解决问题',desc:'2025/06/29 20:15'},
{title:'您的退款申请已审核通过,商品无需退回',desc:'2025/06/29 20:15'},
{title:'已将退款资金提交给原支付平台处理预计将在3个工作日内到账。具体以原支付平台处理结果为准',desc:'2025/06/29 20:15'},
{title:'退款已到账,请您注意查收,如有问题请联系客服',desc:'2025/06/29 20:15'},
])
onLoad((options) => {});
])
//
const previewImage = (item,i)=>{
let picture = returnImageList.value;
uni.previewImage({
current: i,
urls:picture
});
}
const copyText = () =>{
uni.setClipboardData({
data:'售后编号:'+assDetail.value.code,
success: () => {
uni.showToast({
title: '复制成功',
icon: 'success',
});
},
fail: () => {
uni.showToast({
title: '复制失败',
icon: 'none',
});
}
})
}
const api_returngetApplyRecord=()=>{
loads('', true)
return returngetApplyRecord(id.value).then(({data}) => {
uni.hideLoading();
let statustext = "";
if(data.returnState == 1){
statustext = "退款审核中"
}else if(data.returnState == 2){
statustext = "审核通过"
}else if(data.returnState == 3){
statustext = "审核拒绝"
}else if(data.returnState == 4){
statustext = "退款失败"
}
data.statustext = statustext;
if(data.returnImage !== null){
data.returnImageList = data.returnImage.split(",")
}else{
data.returnImageList = [];
}
assDetail.value = data;
returnInfoList.value = data.returnInfoList;
returnImageList.value = data.returnImageList;
}).catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false,
success: () => {
uni.navigateBack({
delta:1
})
}
})
})
}
onLoad((options) => {
if(options.id){
id.value = options.id;
}
api_returngetApplyRecord();
});
onShow(() => {});
onReady(()=>{})
onPullDownRefresh(()=>{})

View File

@ -62,6 +62,7 @@ page{
width: 138rpx;
height: 138rpx;
display: block;
border-radius: 4rpx;
}
}
.cont_shop_text{
@ -70,6 +71,7 @@ page{
font-size: 28rpx;
color: #333333;
font-weight: 500;
min-height: 85rpx;
}
.cont_shop_price{
color: #333333;
@ -93,7 +95,7 @@ page{
margin-right: 5rpx;
}
.cont_shop_desc_num{
margin-left: 40rpx;
// margin-left: 40rpx;
}
}
}
@ -116,10 +118,10 @@ page{
align-items: center;
.cont_shop_item_copy{
width: 77rpx;
height: 40rpx;
height: 30rpx;
border-radius: 20rpx 20rpx 20rpx 20rpx;
border: 1rpx solid #FF0000;
font-size: 22rpx;
font-size: 20rpx;
color:#FF0000;
display: flex;
align-items: center;
@ -135,6 +137,20 @@ page{
}
}
}
.cont_shop_img{
display: flex;
flex-wrap: wrap;
.cont_shop_img_url{
width: 138rpx;
height: 138rpx;
display: block;
border-radius: 4rpx;
border: 1rpx solid #F3F3F3;
margin-right: 25rpx;
margin-bottom: 25rpx;
}
}
.paddom{
padding-bottom: 0rpx;
}

View File

@ -8,58 +8,153 @@
</view>
<view class="cont">
<view class="cont_title">下单时间: 2025/03/06 18:00</view>
<view class="cont_shop" @click="assDetail()">
<view class="cont_shop_l">
<view class="cont_shop_img">
<image class="cont_shop_imgUrl" src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="cont_shop_m">
<view class="cont_shop_title">泡椒田鸡</view>
<view class="cont_shop_text">实付单价:<text class="cont_shop_price">9.99</text> <text class="cont_shop_num">数量:1</text></view>
<view v-for="(item,index) in list" :key="index" class="order_list" @click="assDetail(item)">
<view class="order_type" v-if="active == 1">{{item.returntext}}</view>
<view class="order_time">下单时间:{{item.createTime}}</view>
<view class="order_scroll">
<scroll-view class="order_scroll_ul" :scroll-with-animation="true" :enhanced="true" :show-scrollbar="false" scroll-x="true">
<block v-if="active == 0">
<view class="order_scroll_li" v-for="(i,idx) in item.orderInfoList" :key="index">
<view class="order_scroll_img">
<image class="order_scroll_img_url" :src="i.image" mode="widthFix"></image>
</view>
</view>
</block>
<block v-if="active == 1">
<view class="order_scroll_li" v-for="(i,idx) in item.returnInfoList" :key="index">
<view class="order_scroll_img">
<image class="order_scroll_img_url" :src="i.image" mode="widthFix"></image>
</view>
</view>
</block>
</scroll-view>
</view>
<view class="order_x">
<block v-if="active == 1">共售后{{item.returnNum}}</block>
<block v-if="active == 0">{{item.totalNum}}</block>
{{active == 1 ?'退款金额':'实付'}}:
<text class="order_price">{{active == 1?item.returnAmount:item.payPrice}}</text>
</view>
<view class="order_bottom" v-if="active == 0">
<view class="order_l"></view>
<view class="order_r">
<view class="order_btn" @click.stop="assDetail(item)">申请售后</view>
</view>
</view>
<view :class="active == 0?'cont_shop_r':'cont_shop_n'" >{{active == 0 ?'申请售后':'已完成'}}</view>
</view>
<view class="empty" v-if="img_err && decs">
<view class="empty_cont">
<image class="empty_cont_img" :src="img_err" mode="widthFix"></image>
<view class="empty_cont_title">{{decs}}</view>
</view>
</view>
<view v-else class="load_desc">{{decs}}</view>
</view>
</view>
</template>
<script setup>
import NP from 'number-precision';
import { computed,ref,onMounted,onUnmounted,getCurrentInstance,nextTick } from 'vue';
import { useCounterStore } from '@/store/counter'; // Pinia Store
import { storeToRefs } from 'pinia';//
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
import { returncanApplyOrderList,returnapplyRecordsList } from "@/server/api.js"
const counterStore = useCounterStore(); // 使 Store
const { proxy } = getCurrentInstance();
//使piniastoreToRefs(使)
const {statusHeight,headerHeight,statusBartop } = storeToRefs(counterStore);
const tab = ref(['售后申请','售后记录']);
const active = ref(0);
const list =ref([]);
const decs = ref('');
const pages = ref(0);
const type = ref("");
const img_err = ref("");
const clickOrder=(index)=>{
if(index == active.value) return false;
active.value = index;
list.value = [];
decs.value = '';
pages.value = 0;
api_orderlist();
};
const assDetail=()=>{
const api_orderlist=()=>{
pages.value = pages.value + 1;
img_err.value = "";
decs.value = "—— 加载中... ——";
const params = {
page:pages.value,
limit:'10'
}
let url = "";
if(active.value == 1){
url = returnapplyRecordsList
}else{
url = returncanApplyOrderList
}
return url(params).then(({data}) => {
decs.value = '—— 上拉加载更多 ——';
data.list.forEach(item => {
if(active.value == 1){
if(item.returnState == 1){
item.returntext = "退款审核中"
}else if(item.returnState == 2){
item.returntext = "审核通过"
}else if(item.returnState == 3){
item.returntext = "审核拒绝"
}else{
item.returntext = "退款失败"
}
}
if(active.value == 0){
item.totalNum = item.orderInfoList.reduce((sum, i) => sum + i.cartNum, 0);
}
})
list.value = list.value.concat(data.list);
if(pages.value == 1 && !data.list.length){
img_err.value = "../../static/Empty/order_lisr_img.png"
decs.value = "—— 暂无售后记录 ——"
}else if(data.list.length < 10){
decs.value = '—— 嗷呜,已经到底啦 ——';
}
}).catch(({message}) => {
img_err.value = "../../static/Empty/err.png"
decs.value = `—— ${message||'网络异常'} ——`;
})
}
const assDetail=(item)=>{
if(active.value == 0){
uni.navigateTo({
url:`/order/assedit/assedit`
url:`/order/assedit/assedit?orderId=${item.orderId}`
})
}else{
uni.navigateTo({
url:`/order/assDetail/assDetail`
url:`/order/assDetail/assDetail?id=${item.id}`
})
}
};
onLoad((options) => {
const { type } = options;
if(type == 0 || type == 1){active.value = type;}
if(options.type == 0 || options.type == 1){
active.value = options.type;
}
api_orderlist();
});
onShow(() => {});
onReady(()=>{})
onPullDownRefresh(()=>{})
onReachBottom(()=>{})
onPullDownRefresh(()=>{
list.value = [];
decs.value = '';
pages.value = 0;
api_orderlist();
uni.stopPullDownRefresh();
})
onReachBottom(()=>{
api_orderlist();
})
</script>
<style lang="scss">

View File

@ -44,135 +44,211 @@ page{
}
}
.cont{
margin: 20rpx 20rpx 0 20rpx;
background-color: #FFFFFF;
// margin: 20rpx 20rpx 0 20rpx;
// background-color: #FFFFFF;
border-radius: 16rpx;
padding: 0 0rpx 25rpx 0rpx;
.cont_title{
font-size: 26rpx;
color: #999999;
margin: 0 25rpx 0 25rpx;
padding:25rpx 0 25rpx 0;
border-bottom: 1rpx solid #f6f6f6;
}
.cont_shop{
display: flex;
align-items: center;
justify-content: space-between;
padding: 25rpx 25rpx 0rpx 25rpx ;
.cont_shop_l{
display: flex;
.cont_shop_img{
width: 114rpx;
height: 114rpx;
background: #FFFFFF;
border-radius: 4rpx;
border: 1rpx solid #F3F3F3;
.cont_shop_imgUrl{
width: 114rpx;
height: 114rpx;
display: block;
}
}
.cont_shop_m{
margin-left: 25rpx;
.cont_shop_title{
font-size: 28rpx;
color: #333333;
font-weight: 500;
}
.cont_shop_text{
font-size: 26rpx;
color: #999999;
margin-top: 20rpx;
.cont_shop_price::before{
content:'¥';
font-size: 20rpx;
margin: 0rpx 5rpx 0rpx 5rpx;
}
.cont_shop_num{
margin-left: 20rpx;
}
}
}
.order_list{
margin: 20rpx 20rpx 0 20rpx;
background-color: #FFFFFF;
border-radius: 16rpx;
padding: 0 20rpx 25rpx 20rpx;
.order_type{
font-size: 34rpx;
color: #000000;
font-weight: 500;
padding: 25rpx 0rpx 0rpx 0rpx;
}
.cont_shop_r{
width: 150rpx;
height: 60rpx;
border-radius: 50rpx;
border: 1rpx solid #999999;
font-size: 24rpx;
color: #666666;
display: flex;
align-items: center;
justify-content: center;
}
.cont_shop_n{
height: 60rpx;
border-radius: 50rpx;
.order_time{
color: #999999;
font-size: 26rpx;
color: #666666;
padding-top: 25rpx;
}
.order_scroll{
width:100%;
display: flex;
overflow: hidden;
white-space: nowrap;
left: 0;
top: 0;
margin-top: 25rpx;
.order_scroll_ul{
.order_scroll_li{
width: 138rpx;
display: inline-block;
margin-right: 20rpx;
.order_scroll_img{
background: #FFFFFF;
border-radius: 10rpx;
width: 138rpx;
height: 138rpx;
overflow: hidden;
border: 1rpx solid #F3F3F3;
.order_scroll_img_url{
width: 138rpx;
height: 138rpx;
display: block;
}
}
.order_scroll_title{
color: #333333;
font-size: 26rpx;
font-weight: 500;
white-space: break-spaces;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
display: -webkit-box;
-webkit-line-clamp: 2;
overflow: hidden;
overflow-wrap: break-word;
margin-top: 20rpx;
}
.order_scroll_price{
font-size: 32rpx;
color: #FF0000;
font-weight: 500;
margin-top: 10rpx;
}
.order_scroll_market_name{
color: #999999;
font-size: 28rpx;
text-decoration: line-through;
font-weight: 400;
}
}
}
}
.order_x{
color: #333333;
font-size: 28rpx;
text-align: right;
.order_price{
font-size: 34rpx;
font-weight: 500;
color: #000000;
}
.order_price::before{
content: "¥";
font-size: 26rpx;
margin: 0 5rpx 0 5rpx;
}
}
.order_bottom{
display: flex;
align-items: center;
justify-content: center;
position: relative;
margin-right: 25rpx;
}
.cont_shop_n::after{
content: '';
position: absolute;
top: 50%;
left: 100%;
transform: translate3d(0, -50%, 0) rotate(45deg);
width: 13rpx;
height: 13rpx;
border-top: 3rpx solid #999999;
border-right: 3rpx solid #999999;
justify-content: space-between;
padding: 25rpx 0 0 0;
.order_l{
width: 90rpx;
height: 55rpx;
position: relative;
.more_text{
color: #333333;
font-size: 28rpx;
height: 55rpx;
display: flex;
align-items: center;
}
.more_open{
position: absolute;
left: -10rpx;
z-index: 9999;
top: 55rpx;
.more_j{
width: 0;
height: 0;
border-left: 15rpx solid transparent;
border-right: 15rpx solid transparent;
border-bottom: 15rpx solid #333333;
margin-left: 18rpx;
}
.more_cont{
background-color: #333333;
border-radius: 10rpx;
padding: 0rpx 20rpx 0rpx 20rpx;
margin-top: -2rpx;
.more_item{
font-size: 26rpx;
color: #FFFFFF;
height: 65rpx;
display: flex;
align-items: center;
justify-content: center;
width: 125rpx;
}
.more_border{
border-bottom: 1rpx solid #999999;
}
}
}
}
.order_r{
display: flex;
justify-content: flex-end;
.order_btn{
padding-left: 23rpx;
padding-right: 21rpx;
height: 55rpx;
background: #FFFFFF;
border-radius: 33rpx;
border: 1rpx solid #D9D9D9;
display: flex;
align-items: center;
justify-content: center;
color: #999999;
font-size: 23rpx;
margin-left: 10rpx;
}
.order_bcg{
background: #FF0000;
border-radius: 33rpx;
border: 1rpx solid #FF0000;
color: #ffffff;
font-size: 26rpx;
}
}
}
}
.cont_goos{
display: flex;
align-items: center;
color: #FF0000;
font-size: 26rpx;
padding: 25rpx 25rpx 0rpx 25rpx ;
.cont_goos_img{
width: 40rpx;
height: 40rpx;
display: block;
margin-right: 10rpx;
}
}
.cont_text{
color: #333333;
font-size: 26rpx;
padding: 25rpx 25rpx 0rpx 25rpx ;
}
.cont_ul{
display: flex;
flex-wrap: wrap;
.cont_li{
width: 150rpx;
height: 150rpx;
background: #FFFFFF;
border-radius: 4rpx;
border: 1rpx solid #F3F3F3;
margin-left: 20rpx;
margin-top: 25rpx;
}
.cont_li image{
width: 150rpx;
height: 150rpx;
border-radius: 4rpx;
display: block;
}
}
}
}
}
.load_desc{
font-size: 28rpx;
color: #aaa;
text-align: center;
padding-top: 30rpx;
padding-bottom: 30rpx;
}
.empty{
height:480rpx;
margin:200rpx 20rpx 0rpx 20rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: center;
.empty_cont{
.empty_cont_img{
margin: 0 auto;
width: 355rpx;
height: 280rpx;
display: flex;
}
.empty_cont_title{
font-size: 28rpx;
color: #aaaaaa;
text-align: center;
}
.empty_cont_btn{
margin: 0 auto;
width: 154rpx;
height: 46rpx;
border-radius: 30rpx;
border: 1rpx solid #FF0000;
color: #FF0000;
line-height: 30rpx;
display: flex;
align-items: center;
justify-content: center;
margin-top: 40rpx;
}
}
}

View File

@ -9,8 +9,28 @@
</view>
</view>
<view class="cont_view" :style="{'padding-top':statusBartop+statusHeight+10+'px'}">
<view class="data_list" v-for="(item,index) in orderInfoList" :key="index">
<view class="data_img">
<image class="data_imgUrl" :src="item.image" mode="widthFix"></image>
</view>
<view class="data_text">
<view class="data_title"><text>{{item.storeName}}</text></view>
<view class="data_operate">
<view class="data_num price">{{item.price}}</view>
<view class="data_edit">
<view class="data_edit_img border_l" @click="editAmount(1,item)">
<image class="data_edit_imgurl" :class="item.amount == 0 ? 'opy':''" src="https://zhkj1.oss-cn-shanghai.aliyuncs.com/zhscMerchant/minus.png" mode="widthFix"></image>
</view>
<view class="data_number">{{item.amount}}</view>
<view class="data_edit_img border_r" @click="editAmount(2,item)">
<image class="data_edit_imgurl" :class="item.amount == item.cartNum ? 'opy':''" src="https://zhkj1.oss-cn-shanghai.aliyuncs.com/zhscMerchant/add.png" mode="widthFix"></image>
</view>
</view>
</view>
</view>
</view>
<view class="cont" >
<textarea class="cont_textarea" :disable-default-padding="isIos" placeholder="请填写您的退款理由~"></textarea>
<textarea class="cont_textarea" :disable-default-padding="isIos" placeholder="请填写您的退款理由~" v-model="returnReason"></textarea>
</view>
<view class="cont cont_padding">
<view class="cont_item">
@ -18,7 +38,7 @@
<image class="cont_item_img" src="../../static/ass/money.png" mode="widthFix"></image>
<view class="cont_item_text">退款金额</view>
</view>
<view class="cont_item_r"><input class="cont_item_input" type="digit" placeholder="请输入金额"/><text></text></view>
<view class="cont_item_r"><input class="cont_item_input font_input" disabled="true" type="digit" placeholder="请输入金额" v-model="returnAmount"/><text></text></view>
</view>
<view class="cont_border"></view>
<view class="cont_item">
@ -26,7 +46,7 @@
<image class="cont_item_img" src="../../static/ass/phone.png" mode="widthFix"></image>
<view class="cont_item_text">联系方式</view>
</view>
<view class="cont_item_r"><input class="cont_item_input" type="number" placeholder="请输入电话号码"/></view>
<view class="cont_item_r"><input class="cont_item_input" type="number" placeholder="请输入电话号码" v-model="contactPhone"/></view>
</view>
<view class="cont_border"></view>
<view class="cont_item">
@ -38,13 +58,13 @@
<view class="cont_shop_text">请将菜品图上传</view>
<view class="cont_shop_edit">
<view class="cont_ul">
<view class="cont_li">
<view class="cont_upload_remove">
<view class="cont_li" v-for="(img,i) in returnImage" :key="i">
<view class="cont_upload_remove" @click="delImg(i)">
<image class="cont_upload_remove_img" src="../../static/eval/closeImg.png" mode="widthFix"></image>
</view>
<image class="cont_li_img" src="../../static/Mask.png" mode="widthFix"></image>
<image class="cont_li_img" :src="img" mode="aspectFill" @click="previewImage(i)"></image>
</view>
<view class="cont_li cont_upload">
<view class="cont_li cont_upload" @click="chooseImage()" v-if="returnImage.length <= 5">
<image class="cont_upload_img" src="../../static/ass/uploading.png" mode="widthFix"></image>
<view class="cont_upload_text">添加照片</view>
</view>
@ -53,29 +73,37 @@
</view>
</view>
</view>
<view style="height: 200rpx;"></view>
<view class="footer">
<view class="footer_btn">提交</view>
<view class="footer_btn" :class="!btnShow ? 'opy':''" @click="api_returnreturnApply()">{{!count?"退款数量必须有一项大于0":"提交(共退款"+count+")"}}</view>
</view>
</view>
</template>
<script setup>
import { url } from '@/server/config.js'
import { loads } from '@/utils/index.js'
import { computed,ref,onMounted,onUnmounted,getCurrentInstance,nextTick } from 'vue';
import { useCounterStore } from '@/store/counter'; // Pinia Store
import { storeToRefs } from 'pinia';//
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
import { returngetOrder,returncomputedPrice,returnreturnApply } from "@/server/api.js"
const counterStore = useCounterStore(); // 使 Store
const { proxy } = getCurrentInstance();
//使piniastoreToRefs(使)
const {statusHeight,headerHeight,statusBartop,ButtonWidth,ButtonHeight } = storeToRefs(counterStore);
const {statusHeight,headerHeight,statusBartop,ButtonWidth,ButtonHeight,token } = storeToRefs(counterStore);
const headShow = ref(false);
const showBack = ref(false);
const pageWidth = ref(0);
const opacity = ref(1);
const timeImg = ref('');
const isIos = ref(false);
const orderId = ref("");
const returnAmount = ref(0);
const returnImage = ref([]);
const returnReason = ref('');
const contactPhone = ref('');
const orderInfoList = ref([]);
const id = ref('');
const System = () =>{
const phone = wx.getSystemInfoSync();
if (phone.platform == 'ios') {
@ -83,20 +111,34 @@ const System = () =>{
} else if (phone.platform == 'android') {
isIos.value = false
}
};
}
//
const updatePageWidth = () => {
const systemInfo = uni.getSystemInfoSync();
pageWidth.value = systemInfo.windowWidth;
};
}
const searchWidth = computed(() => {
return pageWidth.value - statusHeight.value - ButtonWidth.value - 35;
})
const count = computed(() => {
const count = orderInfoList.value.filter(item => item.amount > 0);
return count.length
});
const btnShow = computed(() => {
let show = false;
if(count.value && returnReason.value && contactPhone.value && returnImage.value.length){
show = true
}else{
show = false
}
return show;
})
//
const getPages = () => {
const pages = getCurrentPages();
return pages.length > 1;
};
}
const handleBack = () => {
if (getPages()) {
//
@ -107,17 +149,205 @@ const handleBack = () => {
url: '/pages/index/index',
});
}
};
}
const editAmount =(e,list)=>{
const { productId,cartNum,amount } = list;
if(e == 1 && amount == 0) return false;
if(e == 2 && cartNum == amount) return false;
orderInfoList.value.forEach(item=>{
if(item.productId == productId){
if(e == 1){
item.amount = item.amount - 1;
}else{
item.amount = item.amount + 1;
}
}
})
api_returncomputedPrice();
}
//
const delImg = (i) =>{
const item = returnImage.value.slice()
item.splice(i, 1)
returnImage.value = item;
}
//退
const api_returngetOrder=()=>{
loads('', true)
return returngetOrder(orderId.value).then(({data}) => {
uni.hideLoading();
data.orderInfoList.forEach(item=>{
item.amount = 1
})
orderInfoList.value = data.orderInfoList
id.value = data.id
})
.then(()=>api_returncomputedPrice())
.catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false,
success: () => {
uni.navigateBack({
delta:1
})
}
})
})
}
//退
const api_returncomputedPrice=()=>{
//
const items = orderInfoList.value.filter(item => item.amount > 0);
// name age
const request = items.map(item => ({
productId: item.comment,
returnNum: item.amount,
unique:item.attrId
}));
const params = {
orderNo:orderId.value,
returnInfo:request
}
loads('', true)
return returncomputedPrice(params).then(({data}) => {
uni.hideLoading();
returnAmount.value = data.returnAmount;
}).catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false
})
})
}
//退
const api_returnreturnApply=()=>{
if(!count.value){
return false;
}
if(!returnReason.value){
uni.showToast({
title:'输入退款理由',
icon:'error'
})
return false;
}
if(!contactPhone.value){
uni.showToast({
title:'输入联系方式',
icon:'error'
})
return false;
}
if(!returnImage.value.length){
uni.showToast({
title:'上传退款凭证',
icon:'error'
})
return false;
}
//
const items = orderInfoList.value.filter(item => item.amount > 0);
// name age
const request = items.map(item => ({
productId: item.comment,
returnNum: item.amount,
unique:item.attrId
}));
const params = {
contactPhone:contactPhone.value,
id:id.value,
orderNo:orderId.value,
returnImage:returnImage.value.toString(),
returnReason:returnReason.value,
returnInfo: request
}
loads('', true)
return returnreturnApply(params).then(({message}) => {
uni.hideLoading();
uni.showToast({
title:message,
icon:'success',
success: () => {
setTimeout(()=>{
uni.redirectTo({
url:`/order/assList/assList?type=1`
})
},1400)
}
})
}).catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false
})
})
}
//
const previewImage = (i)=>{
let picture = returnImage.value;
uni.previewImage({
current: i,
urls:picture
});
}
//
const chooseImage = () => {
uni.chooseImage({
count: 6, // 6
sizeType: ['original', 'compressed'], //
sourceType: ['album', 'camera'], //
success: (res) => {
api_uploadimage(res.tempFilePaths);
},
fail: (err) => {
console.error('选择图片失败:', err);
}
});
}
//url
const api_uploadimage = (tempFilePaths) =>{
loads('上传中', true)
uni.uploadFile({
url:`${url}/api/front/user/upload/image`, //
filePath: tempFilePaths[0], //
name: 'multipart', //
header: {
'Authori-zation':token.value ,//
'Content-Type': 'multipart/form-data'
},
formData: { //
model: 'wechat',
pid: '8'
},
success: (res) => {
uni.hideLoading()
const data = JSON.parse(res.data); //
returnImage.value.push(data.data.url);
},
fail: (err) => {
uni.hideLoading()
console.error('上传失败:', err);
}
})
}
onLoad((options) => {
System();
//
showBack.value = getPages();
updatePageWidth();
});
if(options.orderId){
orderId.value = options.orderId;
api_returngetOrder()
}
})
onShow(() => {});
onPageScroll((e)=>{
const top = e.scrollTop;
//
//
if (top <= 50) {
headShow.value = false
} else {
@ -128,7 +358,7 @@ onPageScroll((e)=>{
}
headShow.value = true
}
}),
})
onReady(()=>{})
onPullDownRefresh(()=>{})
onReachBottom(()=>{})

View File

@ -48,6 +48,126 @@ page{
border-bottom: 1rpx solid #f6f6f6;
}
.cont_view{
.data_list{
margin: 0rpx 25rpx 25rpx 25rpx;
border-radius: 16rpx;
background-color: #ffffff;
box-shadow: 0rpx 4rpx 8rpx 0rpx rgba(0, 0, 0, 0.05);
display: flex;
justify-content: space-between;
padding: 25rpx;
.data_l{
width: 50rpx;
height: 180rpx;
display: flex;
align-items: center;
justify-content: center;
padding-left: 20rpx;
}
.data_img{
width: 180rpx;
height: 180rpx;
position: relative;
border-radius: 16rpx;
overflow: hidden;
.data_imgUrl{
width: 180rpx;
height: 180rpx;
position: absolute;
top: 0;
z-index: 1;
}
}
.data_text{
width: 455rpx;
.data_title{
font-size: 28rpx;
color: #333333;
font-weight: 500;
margin-top: 5rpx;
min-height: 124rpx;
}
.data_title text {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
font-weight: 400;
}
.data_operate{
display: flex;
align-items: center;
justify-content: space-between;
.data_num{
font-size: 34rpx;
color: #fe4301;
font-weight: 500;
}
.data_edit{
display: flex;
align-items: center;
justify-content: center;
.data_edit_empty{
width: 50rpx;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
.data_edit_em{
background-color: #fe4301;
width: 70rpx;
height: 70rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10rpx;
.data_edit_emptyImg{
width: 30rpx;
height: 30rpx;
}
}
}
.border_l{
border-left: 1px solid #E9E9E9;
border-top-left-radius: 50rpx;
border-bottom-left-radius: 50rpx;
}
.border_r{
border-right: 1px solid #E9E9E9;
border-top-right-radius: 50rpx;
border-bottom-right-radius: 50rpx;
}
.data_edit_img{
width: 55rpx;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
border-top: 1px solid #E9E9E9;
border-bottom: 1px solid #E9E9E9;
.data_edit_imgurl{
width: 25rpx;
height: 25rpx;
display: block;
}
}
.data_number{
width: 60rpx;
height: 50rpx;
font-size: 28rpx;
color: #333;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #E9E9E9;
}
}
}
}
}
.cont{
margin: 0rpx 25rpx 25rpx 25rpx;
padding: 30rpx;
@ -102,6 +222,11 @@ page{
text-align: right;
height: 100%;
}
.font_input{
font-size: 36rpx;
font-weight: 500;
color: #fd3f3f;
}
}
.cont_item_r text{
margin-left: 20rpx;
@ -213,3 +338,11 @@ page{
}
}
}
.price::before {
content: '¥';
font-size: 26rpx;
margin-right: 5rpx;
}
.opy{
opacity: 0.3;
}

View File

@ -4,12 +4,10 @@
<view class="cont_top">
<view class="cont_top_l">
<view class="cont_top_text">商品评价 <text class="cont_top_num">{{count}}</text>/{{evalList.length}}</view>
<view class="cont_top_btn">一键好评</view>
<view class="cont_top_btn" @click="clickShopeval">一键好评</view>
</view>
<view class="cont_top_r">匿名</view>
</view>
<template v-for="(item,index) in evalList" :key="index">
<view class="cont_shop" @click="unfold(item)">
<view class="cont_shop_l">
@ -34,14 +32,14 @@
</view>
<view class="cont_ul">
<view class="cont_li" v-for="(img,i) in item.uploadImg" :key="i">
<view class="cont_li" v-for="(img,i) in item.pics" :key="i">
<view class="cont_upload_remove" @click="delImg(item,i)">
<image class="cont_upload_remove_img" src="../../static/eval/closeImg.png" mode="widthFix"></image>
</view>
<image class="cont_li_img" :src="img" mode="aspectFill"></image>
<image class="cont_li_img" :src="img" mode="aspectFill" @click="previewImage(item,i)"></image>
</view>
<view class="cont_li cont_upload" @click="chooseImage(item)" v-if="item.uploadImg.length <= 5">
<view class="cont_li cont_upload" @click="chooseImage(item)" v-if="item.pics.length <= 5">
<image class="cont_upload_img" src="../../static/eval/adds.png" mode="widthFix"></image>
<view class="cont_upload_text">添加图片</view>
</view>
@ -51,37 +49,43 @@
<view class="cont_shop_border"></view>
</block>
</template>
</view>
<view class="eval_server">
<view class="eval_server_text">服务评价</view>
<view class="eval_server_type">
<block v-for="(i,index) in server_list" :key="index">
<view @click="clickServerEval(i)" class="cont_goos" :class="i.checkedShow?'cont_goos_aver':''"><image class="cont_goos_img" :src="i.checkedShow?i.imgUrl_aver:i.imgUrl" mode="widthFix"></image>{{i.name}}</view>
</block>
</view>
</view>
<view style="height: 300rpx;"></view>
<view class="footer">
<view class="footer_btn" :class="count == 0?'opy':''">提交</view>
<view class="footer_btn" :class="count == 0?'opy':''" @click="commentBtn()">提交</view>
</view>
</view>
</template>
<script setup>
import { url } from '@/server/config.js'
import { loads } from '@/utils/index.js'
import { computed,ref,onMounted,onUnmounted,getCurrentInstance,nextTick } from 'vue';
import { useCounterStore } from '@/store/counter'; // Pinia Store
import { storeToRefs } from 'pinia';//
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
import { orderReplyproduct } from "@/server/api.js"
import { orderReplyproduct,uploadimage,orderReplycomment } from "@/server/api.js"
const counterStore = useCounterStore(); // 使 Store
const { proxy } = getCurrentInstance();
//使piniastoreToRefs(使)
const {statusHeight,headerHeight,statusBartop } = storeToRefs(counterStore);
const {statusHeight,headerHeight,statusBartop,token } = storeToRefs(counterStore);
const active = ref(0);
const isIos = ref(false);
const orderNo = ref("");
const evalList = ref([]);
const serviceScore = ref(5);
const server_list = ref([]);
const count = computed(() => {
const count = evalList.value.filter(item => item.productScore > 0);
return count.length
});
const System = () =>{
const phone = wx.getSystemInfoSync();
if (phone.platform == 'ios') {
@ -95,6 +99,24 @@ const unfold = (e) =>{
if(e.id == item.id){item.show = !item.show;}
})
}
const clickShopeval = () =>{
let productScore = 0;
evalList.value.forEach(item=>{
item.list.forEach(i=>{
if(i.id == 5){
i.checkedShow = true
productScore = 5;
}
})
item.productScore = productScore;
})
server_list.value.forEach(item=>{
if(item.id == 5){
item.checkedShow = true
serviceScore.value = item.id;
}
})
}
const clickEval = (item,i) =>{
let productScore = 0;
evalList.value.forEach(evalList=>{
@ -102,13 +124,7 @@ const clickEval = (item,i) =>{
evalList.list.forEach(item=>{
if(i.id == item.id){
item.checkedShow = true;
if(i.id == 1){
productScore = 2;
}else if(i.id == 2){
productScore = 4;
}else{
productScore = 5;
}
productScore = i.id;
}else{
item.checkedShow = false;
}
@ -120,6 +136,18 @@ const clickEval = (item,i) =>{
}
})
}
const clickServerEval = (i) =>{
let id = 0;
server_list.value.forEach(item=>{
if(i.id == item.id){
item.checkedShow = true;
id = i.id;
}else{
item.checkedShow = false;
}
})
serviceScore.value = id;
}
const api_orderReplyproduct=()=>{
loads('', true)
const params = {
@ -135,34 +163,57 @@ const api_orderReplyproduct=()=>{
item.show = true;
}
item.comment = "";
item.pics = "";
item.pics = [];
item.productScore = 0;
item.serviceScore = 0;
item.uploadImg = [];
item.list = [
{
id:1,
id:2,
imgUrl:'../../static/eval/negative.png',
imgUrl_aver:'../../static/eval/negative_aver.png',
name:"差评",
checkedShow:false
},
{
id:2,
id:4,
imgUrl:'../../static/eval/ordinary.png',
imgUrl_aver:'../../static/eval/ordinary_aver.png',
name:"一般",
checkedShow:false
},
{
id:3,
id:5,
imgUrl:'../../static/eval/good.png',
imgUrl_aver:'../../static/eval/good_aver.png',
name:"好评",
checkedShow:false
}
]
]
})
serviceScore.value = 0;
server_list.value = [
{
id:2,
imgUrl:'../../static/eval/negative.png',
imgUrl_aver:'../../static/eval/negative_aver.png',
name:"差评",
checkedShow:false
},
{
id:3,
imgUrl:'../../static/eval/ordinary.png',
imgUrl_aver:'../../static/eval/ordinary_aver.png',
name:"一般",
checkedShow:false
},
{
id:5,
imgUrl:'../../static/eval/good.png',
imgUrl_aver:'../../static/eval/good_aver.png',
name:"好评",
checkedShow:false
}
]
evalList.value = data;
}).catch(({message}) => {
uni.hideLoading();
@ -177,17 +228,26 @@ const api_orderReplyproduct=()=>{
})
})
}
//
const previewImage = (item,i)=>{
let picture = [];
evalList.value.forEach(list=>{
if(item.id == list.id){
picture = item.pics
}
})
uni.previewImage({
current: i,
urls:picture
});
}
//
const delImg = (e,i) =>{
evalList.value.forEach(item=>{
if(e.id == item.id){
console.log('000000')
const tempFileimg = item.uploadImg.slice()
// const picture = this.picture.slice()
tempFileimg.splice(i, 1)
// picture.splice(i, 1)
item.uploadImg = tempFileimg
// this.picture = picture
const pics = item.pics.slice()
pics.splice(i, 1)
item.pics = pics;
}
})
}
@ -198,29 +258,101 @@ const chooseImage = (e) => {
sizeType: ['original', 'compressed'], //
sourceType: ['album', 'camera'], //
success: (res) => {
// imageList.value = res.tempFilePaths; //
evalList.value.forEach(item=>{
if(e.id == item.id){
item.uploadImg.push(res.tempFilePaths)
}
})
console.log('evalList--',evalList.value);
api_uploadimage(res.tempFilePaths,e);
},
fail: (err) => {
console.error('选择图片失败:', err);
uni.showToast({ title: '选择图片失败', icon: 'none' });
}
});
};
}
//url
const api_uploadimage = (tempFilePaths,e) =>{
loads('上传中', true)
uni.uploadFile({
url:`${url}/api/front/user/upload/image`, //
filePath: tempFilePaths[0], //
name: 'multipart', //
header: {
'Authori-zation':token.value ,//
'Content-Type': 'multipart/form-data'
},
formData: { //
model: 'wechat',
pid: '8'
},
success: (res) => {
uni.hideLoading()
const data = JSON.parse(res.data); //
evalList.value.forEach(item=>{
if(e.id == item.id){
item.pics.push(data.data.url);
}
})
},
fail: (err) => {
uni.hideLoading()
console.error('上传失败:', err);
}
})
}
//
const commentBtn = () => {
//
const items = evalList.value.filter(item => item.productScore > 0);
// name age
const request = items.map(item => ({
comment: item.comment,
pics: item.pics.toString(),
productId:item.productId,
productScore:item.productScore,
serviceScore:serviceScore.value,
isPrivacy:0,
orderNo:orderNo.value,
unique:item.unique
}));
if(!request.length){
uni.showToast({
title:'您还未评价哦!',
icon:'error'
})
return false
}
loads('', true)
// const params = {request}
return orderReplycomment(request).then(({message}) => {
uni.hideLoading();
uni.showToast({
title:message,
icon:'success',
success: () => {
setTimeout(()=>{
uni.redirectTo({
url:`/order/orderevallist/orderevallist?type=1`
})
},1400)
}
})
}).catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false,
success: () => {
uni.navigateBack({
delta:1
})
}
})
})
}
onLoad((options) => {
System();
if(options.orderNo){
orderNo.value = options.orderNo;
api_orderReplyproduct();
}
api_orderReplyproduct();
});
onShow(() => {});
onReady(()=>{})

View File

@ -212,7 +212,38 @@ page{
}
.eval_server{
margin: 20rpx 20rpx 0;
background-color: #fff;
border-radius: 16rpx;
padding-top: 15rpx;
padding-bottom: 15rpx;
padding-left: 25rpx;
display: flex;
align-items: center;
justify-content: space-between;
.eval_server_text{
font-size: 28rpx;
color: #333333;
font-weight: 500;
}
.eval_server_type{
display: flex;
.cont_goos{
display: flex;
align-items: center;
color: #999;
font-size: 26rpx;
padding: 25rpx 25rpx 25rpx 0rpx;
.cont_goos_img{
width: 40rpx;
height: 40rpx;
display: block;
margin-right: 10rpx;
}
}
}
}
.footer{
position: fixed;
left: 0;

View File

@ -6,8 +6,8 @@
<view class="cont_order_type_desc" v-if="orderDetails.orderStatusMsg && orderDetails.status != 5">{{orderDetails.orderStatusMsg}}</view>
</view>
<view class="cont_service">
<image class="cont_service_img" src="../../static/order/ridertel.png" mode="widthFix"></image>
<view class="cont_service_name">联系骑手</view>
<image class="cont_service_img" src="../../static/order/service.png" mode="widthFix"></image>
<view class="cont_service_name">联系客服</view>
</view>
</view>
@ -135,7 +135,7 @@ const evaluate = () =>{
}
const assDetail=()=>{
uni.navigateTo({
url:`/order/assedit/assedit`
url:`/order/assedit/assedit?orderId=${orderDetails.value.orderId}`
})
};
const more_arr = ()=>{

View File

@ -87,6 +87,7 @@ page{
width: 138rpx;
height: 138rpx;
display: block;
border-radius: 4rpx;
}
}
.cont_shop_text{
@ -200,11 +201,11 @@ page{
align-items: center;
.cont_shop_item_copy{
width: 77rpx;
height: 40rpx;
height: 30rpx;
border-radius: 20rpx 20rpx 20rpx 20rpx;
border: 1rpx solid #999999;
font-size: 22rpx;
color:#999999;
border: 1rpx solid #FF0000;
font-size: 20rpx;
color:#FF0000;
display: flex;
align-items: center;
justify-content: center;

View File

@ -97,7 +97,7 @@ const searchWidth = computed(() => {
});
const assDetail=(item)=>{
uni.navigateTo({
url:`/order/assedit/assedit`
url:`/order/assedit/assedit?orderId=${item.orderId}`
})
};
//
@ -188,13 +188,23 @@ const api_orderlist=()=>{
shop_orderlist.value = shop_orderlist.value.concat(data.list);
if(pages.value == 1 && !data.list.length){
img_err.value = "../../static/Empty/order_lisr_img.png"
decs.value = "—— 暂无订单记录 ——"
if(type.value == 0){
decs.value = "—— 暂无待支付记录 ——"
}else if(type.value == 5){
decs.value = "—— 暂无备货记录 ——"
}else if(type.value == 2){
decs.value = "—— 暂无待收货记录 ——"
}else if(type.value == 3){
decs.value = "—— 暂无待评价记录 ——"
}else{
decs.value = "—— 暂无订单记录 ——"
}
}else if(data.list.length < 10){
decs.value = '—— 嗷呜,已经到底啦 ——';
}
}).catch(({message}) => {
img_err.value = "../../static/Empty/err.png"
decs.value = `—— ${message} ——`;
decs.value = `—— ${message||'网络异常'} ——`;
})
}
//

View File

@ -7,69 +7,34 @@
</view>
</view>
<view class="cont">
<view class="cont_title">下单时间: 2025/03/06 18:00</view>
<view class="cont_shop" @click="editEval()">
<view class="cont" v-for="(item,index) in replyList" :key="index">
<view class="cont_title">下单时间:{{item.createTime}}</view>
<view class="cont_shop" @click="editEval(item)">
<view class="cont_shop_l">
<view class="cont_shop_img">
<image class="cont_shop_imgUrl" src="../../static/Mask.png" mode="widthFix"></image>
<image class="cont_shop_imgUrl" :src="item.image" mode="widthFix"></image>
</view>
<view class="cont_shop_title">泡椒田鸡</view>
<view class="cont_shop_title" :class="active == 0?'active':''"><text>{{item.productName}}</text></view>
</view>
<view class="cont_shop_r" v-if="active == 0" >去评价</view>
<view class="cont_shop_r" v-if="active == 0">去评价</view>
</view>
<block v-if="active == 1">
<view class="cont_goos"><image class="cont_goos_img" src="../../static/eval/good.png" mode="widthFix"></image>好评</view>
<view class="cont_text"><text>味道很鲜美分量很足价格实惠</text></view>
<view class="cont_goos"><image class="cont_goos_img" :src="item.img_aver" mode="widthFix"></image>{{item.text}}</view>
<view class="cont_text"><text>{{item.comment}}</text></view>
<view class="cont_ul">
<view class="cont_li">
<image src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="cont_li">
<image src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="cont_li">
<image src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="cont_li">
<image src="../../static/Mask.png" mode="widthFix"></image>
<view class="cont_li" v-for="(img,i) in item.imgArr" :key="i">
<image :src="img" mode="aspectFill" @click="previewImage(item,i)"></image>
</view>
</view>
</block>
</view>
<view class="cont">
<view class="cont_title">下单时间: 2025/03/06 18:00</view>
<view class="cont_shop" @click="editEval()">
<view class="cont_shop_l">
<view class="cont_shop_img">
<image class="cont_shop_imgUrl" src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="cont_shop_title">泡椒田鸡</view>
</view>
<view class="cont_shop_r" v-if="active == 0" >去评价</view>
<view class="empty" v-if="img_err && decs">
<view class="empty_cont">
<image class="empty_cont_img" :src="img_err" mode="widthFix"></image>
<view class="empty_cont_title">{{decs}}</view>
</view>
<block v-if="active == 1">
<view class="cont_goos"><image class="cont_goos_img" src="../../static/eval/negative.png" mode="widthFix"></image>差评</view>
<view class="cont_text"><text>味道很鲜美分量很足价格实惠</text></view>
<view class="cont_ul">
<view class="cont_li">
<image src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="cont_li">
<image src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="cont_li">
<image src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="cont_li">
<image src="../../static/Mask.png" mode="widthFix"></image>
</view>
</view>
</block>
</view>
<view v-else class="load_desc">{{decs}}</view>
</view>
@ -80,30 +45,107 @@ import { computed,ref,onMounted,onUnmounted,getCurrentInstance,nextTick } from '
import { useCounterStore } from '@/store/counter'; // Pinia Store
import { storeToRefs } from 'pinia';//
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
import { orderReplylist } from "@/server/api.js"
const counterStore = useCounterStore(); // 使 Store
const { proxy } = getCurrentInstance();
//使piniastoreToRefs(使)
const {statusHeight,headerHeight,statusBartop } = storeToRefs(counterStore);
const tab = ref(['待评价','已评价']);
const active = ref(0);
const replyList = ref([]);
const decs = ref('');
const pages = ref(0);
const limits = ref(10);
const img_err = ref("");
const type = ref(0);
const clickOrder=(index)=>{
if(index == active.value) return false;
type.value = index;
active.value = index;
replyList.value = [];
decs.value = '';
pages.value = 0;
api_orderReplylist();
};
const editEval=()=>{
const editEval=(item)=>{
if(active.value != 0) return false;
uni.navigateTo({
url:`/order/editeval/editeval`
url:`/order/editeval/editeval?orderNo=${item.orderNo}`
})
};
}
//
const previewImage = (item,i)=>{
let picture = [];
replyList.value.forEach(list=>{
if(item.productId == list.productId){
picture = item.imgArr
}
})
uni.previewImage({
current: i,
urls:picture
});
}
const api_orderReplylist=()=>{
pages.value = pages.value + 1;
img_err.value = "";
decs.value = "—— 加载中... ——";
const params = {
type:type.value,
page:pages.value,
limit:limits.value
}
return orderReplylist(params).then(({data}) => {
decs.value = '—— 上拉加载更多 ——';
data.list.forEach(item=>{
if(item.pics !== null){
item.imgArr = item.pics.split(",");
}
if(item.scoreGrade == 1){
item.img_aver = "../../static/eval/good_aver.png";
item.text = "好评"
}else if(item.scoreGrade == 2){
item.img_aver = "../../static/eval/ordinary_aver.png";
item.text = "一般"
}else if(item.scoreGrade == 3){
item.img_aver = "../../static/eval/negative_aver.png";
item.text = "差评"
}else{
item.img_aver = "";
item.text = "";
}
})
replyList.value = replyList.value.concat(data.list);
if(pages.value == 1 && !data.list.length){
img_err.value = "../../static/Empty/order_lisr_img.png"
decs.value = "—— 抱歉,该页面没有相关内容 ——"
}else if(data.list.length < 10){
decs.value = '—— 嗷呜,已经到底啦 ——';
}
}).catch(({message}) => {
img_err.value = "../../static/Empty/err.png"
decs.value = `—— ${message||'网络异常'} ——`;
})
}
onLoad((options) => {
const { type } = options;
if(type == 0 || type == 1){active.value = type;}
if(options.type == 0 || options.type == 1){
active.value = options.type;
type.value = options.type;
}
api_orderReplylist();
});
onShow(() => {});
onReady(()=>{})
onPullDownRefresh(()=>{})
onReachBottom(()=>{})
onPullDownRefresh(()=>{
replyList.value = [];
decs.value = '';
pages.value = 0;
api_orderReplylist();
})
onReachBottom(()=>{
api_orderReplylist();
})
</script>
<style lang="scss">

View File

@ -72,18 +72,30 @@ page{
width: 114rpx;
height: 114rpx;
display: block;
border-radius: 4rpx;
}
}
.active{
width: 380rpx;
}
.cont_shop_title{
font-size: 28rpx;
color: #333333;
margin-left: 25rpx;
margin-left: 20rpx;
font-weight: 500;
}
.cont_shop_title text{
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
word-break: break-all;
}
}
.cont_shop_r{
width: 150rpx;
height: 60rpx;
width: 130rpx;
height: 50rpx;
background: linear-gradient( 90deg, #FD4955 0%, #FD343C 100%);
border-radius: 39rpx;
display: flex;
@ -131,10 +143,46 @@ page{
display: block;
}
}
}
}
.load_desc{
font-size: 28rpx;
color: #aaa;
text-align: center;
padding-top: 30rpx;
padding-bottom: 30rpx;
}
.empty{
height:480rpx;
margin:200rpx 20rpx 0rpx 20rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: center;
.empty_cont{
.empty_cont_img{
margin: 0 auto;
width: 355rpx;
height: 280rpx;
display: flex;
}
.empty_cont_title{
font-size: 28rpx;
color: #aaaaaa;
text-align: center;
}
.empty_cont_btn{
margin: 0 auto;
width: 154rpx;
height: 46rpx;
border-radius: 30rpx;
border: 1rpx solid #FF0000;
color: #FF0000;
line-height: 30rpx;
display: flex;
align-items: center;
justify-content: center;
margin-top: 40rpx;
}
}
}

View File

@ -126,7 +126,8 @@
"path": "orderevallist/orderevallist",
"style": {
"navigationBarTitleText": "评价中心",
"navigationBarBackgroundColor": "#FFFFFF"
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": true
}
},
{
@ -140,7 +141,8 @@
"path": "assList/assList",
"style": {
"navigationBarTitleText": "退款/售后",
"navigationBarBackgroundColor": "#FFFFFF"
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": true
}
},
{

View File

@ -280,10 +280,8 @@ const api_cartlist = (e) =>{
})
.catch(({message}) => {
uni.hideLoading()
uni.showModal({
content:message,
showCancel: false
})
img_err.value = "../../static/Empty/err.png"
cartdecs.value = `—— ${message||'网络异常'} ——`;
})
}
//

View File

@ -131,8 +131,8 @@ page{
}
.empty_cont_btn{
margin: 0 auto;
width: 154rpx;
height: 46rpx;
width: 200rpx;
height: 60rpx;
border-radius: 30rpx;
border: 1rpx solid #FF0000;
color: #FF0000;

View File

@ -85,6 +85,55 @@
</view> -->
<!-- 获取定位失败小组件提示 -->
<locationOpen></locationOpen>
<!-- 多规格组件弹框 -->
<uni-popup ref="multiPopup" type="bottom" @change="changeMulti">
<view class="multiPopup">
<view class="shop_open_close" @click="OpenCoupon()">
<image src="../../static/order/close.png" mode="widthFix"></image>
</view>
<view class="multishop">
<image class="multishop_img" src="http://mnse8q.natappfree.cc/crmebimage/public/content/2025/03/06/8b55b251f89942fbaac25f72143be0e15jg9vmswjy.png" mode="widthFix"></image>
<view class="multishop_text">
<view class="multishop_title"><text>蔡长青烟熏鸡肉沙拉调味沙拉210g</text></view>
<view class="multishop_price">14.90<text class="multishop_name">5.00</text></view>
</view>
</view>
<view class="multishop_list">
<view class="multishop_list_title">颜色</view>
<view class="multishop_list_item">
<view class="multishop_list_name multishop_list_arver">沙漠色</view>
<view class="multishop_list_name">黑色</view>
<view class="multishop_list_name">原色</view>
<view class="multishop_list_name">白色</view>
</view>
</view>
<view class="multishop_list">
<view class="multishop_list_title">容量</view>
<view class="multishop_list_item">
<view class="multishop_list_name multishop_list_arver">256GB</view>
<view class="multishop_list_name">512GB</view>
<view class="multishop_list_name">1TB</view>
</view>
</view>
<view style="height: 200rpx;"></view>
<view class="footer_multi">
<view class="multishop_amount">
<view class="multishop_name_amount">选数量</view>
<view class="multishop_data_edit">
<view class="multishop_data_edit_img border_l" @click="editAmount(1,item)">
<image class="multishop_data_edit_imgurl" src="https://zhkj1.oss-cn-shanghai.aliyuncs.com/zhscMerchant/minus.png" mode="widthFix"></image>
</view>
<view class="multishop_data_number">22</view>
<view class="multishop_data_edit_img border_r" @click="editAmount(2,item)">
<image class="multishop_data_edit_imgurl" src="https://zhkj1.oss-cn-shanghai.aliyuncs.com/zhscMerchant/add.png" mode="widthFix"></image>
</view>
</view>
</view>
<view class="footer_multi_btn">确定</view>
</view>
</view>
</uni-popup>
</view>
</template>
@ -101,6 +150,7 @@ const counterStore = useCounterStore(); // 使用 Store
//使piniastoreToRefs(使)
const {statusHeight,headerHeight,nikeName,key,token,phone,uid,storeName,storeId,latitude,longitude,locationName,locationShow } = storeToRefs(counterStore);
const homeList = ref([]);
const multiPopup = ref(null);
const shopList = ref([]);
const total = ref(0);
const pages = ref(0);
@ -115,6 +165,7 @@ const api_index=()=>{
uni.hideLoading();
homeList.value = data.homeList;
ishomeListLoaded.value = true;
multiPopup.value.open();
})
.catch(({message}) => {
uni.hideLoading();

View File

@ -438,4 +438,187 @@ page{
transform: scale(1.05);
}
}
// 结束
// 结束
//多规格
.multiPopup{
background-color: #FFFFFF;
border-top-left-radius: 25rpx;
border-top-right-radius: 25rpx;
max-height: 800rpx;
overflow-y: auto;
position: relative;
.shop_open_close{
width: 80rpx;
height: 80rpx;
position: absolute;
top: 0;
right: 0;
display: flex;
align-items: center;
justify-content: center;
}
.shop_open_close image{
width: 45rpx;
height: 45rpx;
}
.multishop{
display: flex;
padding: 25rpx 25rpx 0rpx 25rpx;
.multishop_img{
width: 180rpx;
height: 180rpx;
border-radius: 10rpx;
}
.multishop_text{
width: 460rpx;
margin-left: 20rpx;
.multishop_title{
font-size: 28rpx;
color: #333;
font-weight: 500;
margin-top: 5rpx;
min-height: 115rpx;
}
.multishop_title text{
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.multishop_price{
font-size: 32rpx;
color: #FD3F3F;
font-weight: 500;
.multishop_name{
color: #999;
font-size: 23rpx;
text-decoration: line-through;
margin-left: 5rpx;
font-weight: 400;
}
.multishop_name::before{
content: "¥";
font-size: 20rpx;
margin-right: 5rpx;
}
}
.multishop_price::before{
content: "¥";
font-size: 24rpx;
margin-right: 5rpx;
}
}
}
.multishop_list{
padding: 25rpx 25rpx 0rpx 25rpx;
.multishop_list_title{
font-size: 28rpx;
color: #333;
font-weight: 500;
margin-bottom: 25rpx;
}
.multishop_list_item{
display: flex;
flex-wrap: wrap;
.multishop_list_name{
padding: 12rpx 35rpx 12rpx 35rpx;
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #333333;
background-color: #f6f6f6;
margin-right: 25rpx;
margin-bottom: 25rpx;
border:1px solid #f6f6f6;
}
.multishop_list_arver{
background-color: #FFD7D7;
border:1px solid #fd3f3f;
color: #fd3f3f;
}
}
}
.footer_multi{
position: fixed;
bottom: 0rpx;
width: 100%;
background-color: #FFFFFF;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
.multishop_amount{
display: flex;
align-items: center;
justify-content: space-between;
padding-left: 25rpx;
padding-right: 25rpx;
margin-top: 15rpx;
margin-bottom: 40rpx;
.multishop_name_amount{
font-size: 28rpx;
color: #333;
font-weight: 500;
}
.multishop_data_edit{
display: flex;
align-items: center;
justify-content: center;
.multishop_data_edit_img{
width: 55rpx;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
border-top: 1px solid #E9E9E9;
border-bottom: 1px solid #E9E9E9;
.multishop_data_edit_imgurl{
width: 25rpx;
height: 25rpx;
display: block;
}
}
.border_l{
border-left: 1px solid #E9E9E9;
border-top-left-radius: 50rpx;
border-bottom-left-radius: 50rpx;
}
.border_r{
border-right: 1px solid #E9E9E9;
border-top-right-radius: 50rpx;
border-bottom-right-radius: 50rpx;
}
}
.multishop_data_number{
width: 60rpx;
height: 50rpx;
font-size: 28rpx;
color: #333;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #E9E9E9;
}
}
.footer_multi_btn{
margin: 0 28rpx 0 28rpx;
height:84rpx;
background-color: #FD3F3F;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
color: #FFFFFF;
border-radius: 50rpx;
}
}
}

View File

@ -233,7 +233,7 @@ export const couponreceive = (data) => {
}
//图片上传
export const uploadimage = (data) => {
return request({url:`/api/front/user/upload/image`,method:'POST',data});
return request({url:`/api/front/user/upload/image`,method:'POST',data,contenttype:'application/x-www-form-urlencoded'});
}
//添加收藏产品
export const collectadd = (data) => {
@ -271,3 +271,8 @@ export const searchkeyword = (data) => {
export const frontshare = (data) => {
return request({url:`/api/front/share`,method:'GET',data});
}
//获取购物车数量
export const frontcartcount = () => {
const data = {numType:1,type:'total'}
return request({url:`/api/front/cart/count`,method:'GET',data});
}

View File

@ -9,7 +9,7 @@ const type = 'dev'
* prod生产
*/
if(type === 'dev'){
url = "http://yz29xy.natappfree.cc";
url = "http://mnse8q.natappfree.cc";
}
if(type === 'test'){
url = "https://japiuat.3721zh.com/webapp";

View File

@ -59,15 +59,15 @@
<view class="footer">
<view class="footer_cont">
<view class="footer_l">
<view class="footer_li">
<view class="footer_li" @click="favorite">
<view class="footer_icon">
<image class="footer_icon_img" src="../../static/shopdetail/collect.png" mode="widthFix"></image>
<image class="footer_icon_img" :src="productInfo.favor_img" mode="widthFix"></image>
</view>
<view class="footer_name">收藏</view>
</view>
<view class="footer_li" @click="goCart()">
<view class="footer_icon">
<view class="footer_amount">45</view>
<view class="footer_amount" v-if="cartcount > 0">{{cartcount}}</view>
<image class="footer_icon_img" src="../../static/shopdetail/cart.png" mode="widthFix"></image>
</view>
<view class="footer_name">购物车</view>
@ -121,8 +121,8 @@ const sliderImages = ref([]);
const content = ref('');
const productId = ref('');
//使piniastoreToRefs(使)
const {statusHeight,headerHeight,statusBartop,token } = storeToRefs(counterStore);
import { frontdetail } from '@/server/api'
const {statusHeight,headerHeight,statusBartop,token,cartcount } = storeToRefs(counterStore);
import { frontdetail,collectdelete,collectcancel,collectadd,frontcartcount } from '@/server/api'
const Openqc =() =>{
qcShow.value ? qcPopup.value.close():qcPopup.value.open()
};
@ -210,10 +210,15 @@ const orderConfirm = ()=>{
}
const api_detail=(id)=>{
const api_detail=()=>{
loads('', true);
return frontdetail(id).then(({data}) => {
return frontdetail(productId.value).then(({data}) => {
uni.hideLoading();
if(data.userCollect){
data.favor_img = "../../static/shopdetail/collect_acer.png"
}else{
data.favor_img = "../../static/shopdetail/collect.png"
}
productAttr.value = data.productAttr;
productInfo.value = data;
productValue.value = data.productValue;
@ -221,6 +226,33 @@ const api_detail=(id)=>{
if(data.content){
content.value = data.content.replace(/\<img|\width:[^;]+;/gi,'<img style="width:100%;height:auto;display:block;" ');
}
})
.then(()=>api_frontcartcount())
.catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false
})
})
}
const favorite = ()=>{
if(productInfo.value.userCollect){
api_collectcancel();
}else{
api_collectadd();
}
}
const api_collectadd=()=>{
loads('', true);
let data = {
category:"store",
id:productInfo.value.id
}
return collectadd(data).then(({message}) => {
uni.hideLoading();
api_detail();
}).catch(({message}) => {
uni.hideLoading();
uni.showModal({
@ -229,6 +261,24 @@ const api_detail=(id)=>{
})
})
}
const api_collectcancel=()=>{
loads('', true);
return collectcancel(productInfo.value.id).then(({message}) => {
uni.hideLoading();
api_detail();
}).catch(({message}) => {
uni.hideLoading();
uni.showModal({
content:message,
showCancel: false
})
})
}
//
const api_frontcartcount=()=>{
frontcartcount().then(({data}) => {cartcount.value = data.count;})
}
const onSearch=()=>{
uni.navigateTo({
url:`/userserve/SearchProduct/SearchProduct`
@ -240,7 +290,7 @@ onLoad((options) => {
showBack.value = getPages();
if(id){
productId.value = id;
api_detail(id)
api_detail()
}
});
onShow(() => {});

View File

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -19,6 +19,7 @@ export const useCounterStore = defineStore('counter',()=>{
const longitude = ref('');
const locationName = ref('正在获取定位');
const locationShow = ref(false);
const cartcount = ref(0)
// 设置 Token
const setToken = (tokens,uids,phones,nikeNames) => {
token.value = tokens;
@ -51,6 +52,7 @@ export const useCounterStore = defineStore('counter',()=>{
latitude,
longitude,
locationName,
locationShow
locationShow,
cartcount
}
})

View File

@ -1,6 +1,6 @@
<template>
<view class="main">
<view class="location_cont location_padding">
<view class="location_cont location_padding" v-if="list.length">
<uni-swipe-action>
<uni-swipe-action-item v-for="(item,index) in list" :key="index" :right-options="options" @click="removeCart(item)">
<view class="location_list flex" :class="index != list.length - 1?'location_border':''" @click.stop="select_address(item)">
@ -18,6 +18,13 @@
</uni-swipe-action-item>
</uni-swipe-action>
</view>
<view class="empty" v-if="img_err && decs">
<view class="empty_cont">
<image class="empty_cont_img" :src="img_err" mode="widthFix"></image>
<view class="empty_cont_title">{{decs}}</view>
</view>
</view>
<view v-else class="load_desc">{{decs}}</view>
<view style="height: 200rpx;"></view>
<view class="footer">
<view class="footer_btn" @click="addressEdit">新增地址</view>
@ -40,6 +47,7 @@ const limits = ref(10);
const decs = ref('');
const list = ref([]);
const address_isDefault = ref(false);
const img_err = ref("");
const options = ref([
{
text: '删除',
@ -50,6 +58,7 @@ const options = ref([
]);
const api_addresslist=()=>{
pages.value = pages.value + 1;
img_err.value = "";
decs.value = "—— 加载中... ——";
const params = {
page:pages.value,
@ -57,15 +66,16 @@ const api_addresslist=()=>{
}
return addresslist(params).then(({data}) => {
decs.value = '—— 上拉加载更多 ——'
if(data.list.length < 10){
list.value = list.value.concat(data.list);
if(pages.value == 1 && !data.list.length){
img_err.value = "../../static/Empty/addressImg.png"
decs.value = "—— 暂无地址 ——"
}else if(data.list.length < 10){
decs.value = '—— 嗷呜,已经到底啦 ——';
}
list.value = list.value.concat(data.list);
}).catch(({message}) => {
uni.showModal({
content:message,
showCancel: false
})
img_err.value = "../../static/Empty/err.png"
decs.value = `—— ${message||'网络异常'} ——`;
})
}
const select_address=(item)=>{

View File

@ -93,4 +93,45 @@ page{
font-size: 28rpx;
}
}
}
.load_desc{
font-size: 28rpx;
color: #aaa;
text-align: center;
padding-top: 30rpx;
padding-bottom: 30rpx;
}
.empty{
height:480rpx;
margin:200rpx 20rpx 0rpx 20rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: center;
.empty_cont{
.empty_cont_img{
margin: 0 auto;
width: 355rpx;
height: 280rpx;
display: flex;
}
.empty_cont_title{
font-size: 28rpx;
color: #aaaaaa;
text-align: center;
}
.empty_cont_btn{
margin: 0 auto;
width: 154rpx;
height: 46rpx;
border-radius: 30rpx;
border: 1rpx solid #FF0000;
color: #FF0000;
line-height: 30rpx;
display: flex;
align-items: center;
justify-content: center;
margin-top: 40rpx;
}
}
}

View File

@ -1,59 +1,30 @@
<template>
<view class="main">
<view class="list">
<view class="list" v-for="(item,index) in shop_list" :key="index">
<view class="list_l">
<image class="list_img" src="../../static/Mask.png" mode="widthFix"></image>
<image class="list_img" :src="item.image" mode="widthFix"></image>
</view>
<view class="list_r">
<view class="list_title">糖醋排骨</view>
<view class="list_tag">
<view class="list_title">{{item.storeName}}</view>
<!-- <view class="list_tag">
<view class="list_li">半小时送达</view>
<view class="list_li">劲辣胃浓</view>
</view>
</view> -->
<view class="list_bottom">
<view class="list_price price">43.9<text class="market_name prices">59.9</text></view>
<view class="list_price price">{{item.price}}</view>
<view class="list_shop_cart">
<image class="list_cart_img" src="../../static/oncatr01.png" mode="widthFix"></image>
</view>
</view>
</view>
</view>
<view class="list">
<view class="list_l">
<image class="list_img" src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="list_r">
<view class="list_title">糖醋排骨</view>
<view class="list_tag">
<view class="list_li">半小时送达</view>
<view class="list_li">劲辣胃浓</view>
</view>
<view class="list_bottom">
<view class="list_price price">43.9<text class="market_name prices">59.9</text></view>
<view class="list_shop_cart">
<image class="list_cart_img" src="../../static/oncatr01.png" mode="widthFix"></image>
</view>
</view>
</view>
</view>
<view class="list">
<view class="list_l">
<image class="list_img" src="../../static/Mask.png" mode="widthFix"></image>
</view>
<view class="list_r">
<view class="list_title">糖醋排骨</view>
<view class="list_tag">
<view class="list_li">半小时送达</view>
<view class="list_li">劲辣胃浓</view>
</view>
<view class="list_bottom">
<view class="list_price price">43.9<text class="market_name prices">59.9</text></view>
<view class="list_shop_cart">
<image class="list_cart_img" src="../../static/oncatr01.png" mode="widthFix"></image>
</view>
</view>
</view>
</view>
<view class="empty" v-if="img_err && decs">
<view class="empty_cont">
<image class="empty_cont_img" :src="img_err" mode="widthFix"></image>
<view class="empty_cont_title">{{decs}}</view>
</view>
</view>
<view v-else class="load_desc">{{decs}}</view>
</view>
</template>
@ -62,18 +33,53 @@ import { computed,ref,onMounted,onUnmounted,getCurrentInstance,nextTick } from '
import { useCounterStore } from '@/store/counter'; // Pinia Store
import { storeToRefs } from 'pinia';//
import { onLoad,onShow,onPullDownRefresh,onPageScroll,onReachBottom,onReady } from "@dcloudio/uni-app"
import { collectuser } from "@/server/api.js"
const counterStore = useCounterStore(); // 使 Store
const { proxy } = getCurrentInstance();
const shop_list = ref([])
const img_err = ref("");
const decs = ref('');
const pages = ref(0);
const limits = ref(10);
//使piniastoreToRefs(使)
const {statusHeight,headerHeight,statusBartop,ButtonWidth,ButtonHeight } = storeToRefs(counterStore);
const api_collectuser=()=>{
pages.value = pages.value + 1;
img_err.value = "";
decs.value = "—— 加载中... ——";
const params = {
page:pages.value,
limit:limits.value
}
return collectuser(params).then(({data}) => {
decs.value = '—— 上拉加载更多 ——';
shop_list.value = shop_list.value.concat(data.list);
if(pages.value == 1 && !data.list.length){
img_err.value = "../../static/Empty/order_lisr_img.png"
decs.value = "—— 暂无收藏记录 ——"
}else if(data.list.length < 10){
decs.value = '—— 嗷呜,已经到底啦 ——';
}
}).catch(({message}) => {
img_err.value = "../../static/Empty/err.png"
decs.value = `—— ${message||'网络异常'} ——`;
})
}
onLoad((options) => {
api_collectuser();
});
onShow(() => {});
onReady(()=>{})
onPullDownRefresh(()=>{})
onReachBottom(()=>{})
onPullDownRefresh(()=>{
shop_list.value = [];
decs.value = '';
pages.value = 0;
api_collectuser();
uni.stopPullDownRefresh();
})
onReachBottom(()=>{
api_collectuser();
})
</script>
<style lang="scss">

View File

@ -29,6 +29,7 @@ page{
font-size: 28rpx;
color: #000000;
font-weight: 500;
min-height: 70rpx;
}
.list_tag{
display: flex;
@ -87,5 +88,45 @@ page{
margin-left: 5rpx;
font-weight: 400;
}
}
}
.load_desc{
font-size: 28rpx;
color: #aaa;
text-align: center;
padding-top: 30rpx;
padding-bottom: 30rpx;
}
.empty{
height:480rpx;
margin:200rpx 20rpx 0rpx 20rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: center;
.empty_cont{
.empty_cont_img{
margin: 0 auto;
width: 355rpx;
height: 280rpx;
display: flex;
}
.empty_cont_title{
font-size: 28rpx;
color: #aaaaaa;
text-align: center;
}
.empty_cont_btn{
margin: 0 auto;
width: 154rpx;
height: 46rpx;
border-radius: 30rpx;
border: 1rpx solid #FF0000;
color: #FF0000;
line-height: 30rpx;
display: flex;
align-items: center;
justify-content: center;
margin-top: 40rpx;
}
}
}