Files
2025-06-11 10:21:51 +08:00

325 lines
8.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="evaluate pb100" v-if="!loadding">
<form @submit="formSubmit" @reset="formReset">
<view class="evaluate-item p30" v-for="(item, index) in tableData" :key="index">
<view class="product d-s-c">
<view class="cover"><image :src="item.image.file_path" mode="aspectFit"></image></view>
<view class="info ml20">
<view class="name f28">{{ item.product_name }}</view>
<view class="price pt10 f22 red">
¥
<text class="f40">{{ item.product_price }}</text>
</view>
</view>
</view>
<view class="grade evalu p-30-0 mt30">
<view class="evalu-value">
描述相符
<view class="eval">
<i
v-for="(itemEv, indexEv) in describe[index]"
:key="indexEv"
:class="itemEv ? 'icon iconfont icon-start' : 'icon iconfont icon-start1'"
@click="choosees(indexEv, index)"
></i>
</view>
</view>
<view class="evalu-value">
服务态度
<view class="eval">
<i
v-for="(itemEv, indexEv) in service[index]"
:key="indexEv"
:class="itemEv ? 'icon iconfont icon-start' : 'icon iconfont icon-start1'"
@click="chooseServ(indexEv, index)"
></i>
</view>
</view>
<view class="evalu-value">
配送服务
<view class="eval">
<i
v-for="(itemEv, indexEv) in logistics[index]"
:key="indexEv"
:class="itemEv ? 'icon iconfont icon-start' : 'icon iconfont icon-start1'"
@click="chooseLog(indexEv, index)"
></i>
</view>
</view>
</view>
<view class="grade d-a-c p-30-0 mt30">
<view :class="item.score == 10 ? 'flex-1 d-c-c active' : 'flex-1 d-c-c'" @click="gradeFunc(item, 10, index)">
<view class="item d-c-c">
<text class="icon iconfont icon-pingjiahaoping"></text>
<text class="ml10">好评</text>
</view>
</view>
<view :class="item.score == 20 ? 'flex-1 d-c-c active' : 'flex-1 d-c-c'" @click="gradeFunc(item, 20, index)">
<view class="item d-c-c">
<text class="icon iconfont icon-pingjiazhongping"></text>
<text class="ml10">中评</text>
</view>
</view>
<view :class="item.score == 30 ? 'flex-1 d-c-c active' : 'flex-1 d-c-c'" @click="gradeFunc(item, 30, index)">
<view class="item d-c-c">
<text class="icon iconfont icon-pingjiachaping"></text>
<text class="ml10">差评</text>
</view>
</view>
</view>
<view class="textarea-box d-s-c f28"><textarea class="p10 box-s-b border flex-1" v-model="item.content" placeholder="请输入评价内容" /></view>
<view class="upload-list d-s-c" v-model="item.image_list">
<view class="item" v-for="(imgs, img_num) in item.image_list" :key="img_num" @click="deleteImg(index, img_num)">
<image :src="imgs.file_path" mode="aspectFit"></image>
</view>
<view class="item upload-btn d-c-c d-c" @click="openUpload(index)" v-if="item.image_list.length < 9">
<text class="icon iconfont icon-xiangji"></text>
<text class="gray9">上传图片</text>
</view>
</view>
</view>
<view class="foot-btns"><button form-type="submit" class="btn-red">确认提交</button></view>
</form>
<!--上传图片-->
<Upload v-if="isUpload" @getImgs="getImgsFunc"></Upload>
</view>
</template>
<script>
import Upload from '@/components/upload/upload.vue';
export default {
components: {
Upload
},
data() {
return {
/*是否加载完成*/
loadding: true,
order_id: '',
/*页面数据*/
tableData: [],
score: 10,
/*是否打开上传图片*/
isUpload: false,
image_id: [],
img: '/static/temp/photo.jpg',
index: '',
service: [],
logistics: [],
describe: []
};
},
onLoad(e) {
this.order_id = e.order_id;
},
mounted() {
uni.showLoading({
title: '加载中'
});
/*获取页面数据*/
this.getData();
},
methods: {
getData() {
let self = this;
let order_id = self.order_id;
self._get(
'user.comment/order',
{
order_id: order_id
},
function(res) {
self.tableData = res.data.productList;
let b = self.tableData.forEach((item, index) => {
self.tableData[index].score = 10;
self.tableData[index].image_list = [];
self.service.push([false, false, false, false, false]);
self.logistics.push([false, false, false, false, false]);
self.describe.push([false, false, false, false, false]);
});
self.loadding = false;
uni.hideLoading();
}
);
},
/*选择评价*/
gradeFunc(item, e, index) {
item.score = e;
this.$set(this.tableData, index, item);
console.log(this.tableData);
},
/* 物流评分 */
chooseLog(n, m) {
let self = this;
self.tableData[m].express_score = 0;
this.logistics[m].forEach((item, index) => {
if (index <= n) {
this.logistics[m].splice(index, 1, true);
self.tableData[m].express_score++;
} else {
this.logistics[m].splice(index, 1, false);
}
});
},
/* 服务评分 */
chooseServ(n, m) {
let self = this;
self.tableData[m].server_score = 0;
this.service[m].forEach((item, index) => {
if (index <= n) {
this.service[m].splice(index, 1, true);
self.tableData[m].server_score++;
} else {
this.service[m].splice(index, 1, false);
}
});
console.log(self.tableData);
},
/* 描述评分 */
choosees(n, m) {
let self = this;
self.tableData[m].describe_score = 0;
this.describe[m].forEach((item, index) => {
if (index <= n) {
this.describe[m].splice(index, 1, true);
self.tableData[m].describe_score++;
} else {
this.describe[m].splice(index, 1, false);
}
});
console.log(self.tableData);
},
/*提交*/
formSubmit: function(e) {
let self = this;
let order_id = self.order_id;
let formData = [];
this.tableData.forEach((item, index) => {
formData[index] = {
order_product_id: item.order_product_id,
product_id: item.product_id,
score: item.score,
image_list: item.image_list,
express_score: item.express_score,
server_score: item.server_score,
describe_score: item.describe_score,
content: ''
};
if (item.content) {
formData[index].content = item.content;
}
});
console.log(formData);
self._post(
'user.comment/order',
{
order_id: order_id,
formData: JSON.stringify(formData)
},
function(res) {
self.showSuccess('评价成功!', function() {
self.gotoPage('/pages/order/myorder', 'redirect');
});
}
);
},
/*打开上传图片*/
openUpload(index) {
this.isUpload = false;
this.index = index;
this.isUpload = true;
},
/*获取上传的图片*/
getImgsFunc(e) {
let self = this;
if (e && typeof e != 'undefined') {
let index = self.index;
self.tableData[index].image_list = self.tableData[index].image_list.concat(e);
}
self.isUpload = false;
},
/*点击图片删除*/
deleteImg(i, n) {
let data = this.tableData[i];
data.image_list.splice(n, 1);
this.$set(this.tableData, i, data);
}
}
};
</script>
<style>
.evaluate {
/* background: #eeeeee; */
}
.evaluate-item {
margin-bottom: 20rpx;
background: #ffffff;
border-bottom: 1px solid #dddddd;
}
.product .cover,
.product .cover image {
width: 160rpx;
height: 160rpx;
}
.evaluate .grade .item .iconfont {
width: 60rpx;
height: 60rpx;
line-height: 60rpx;
border-radius: 50%;
font-size: 40rpx;
color: #ffffff;
text-align: center;
}
.evaluate .grade .item {
height: 60rpx;
padding-right: 20rpx;
line-height: 60rpx;
border-radius: 30rpx;
transition: background-color 0.4s;
}
.grade .flex-1:nth-child(1) .iconfont {
background: #f42222;
}
.grade .flex-1:nth-child(2) .iconfont {
background: #f2b509;
}
.grade .flex-1:nth-child(3) .iconfont {
background: #999999;
}
.grade .flex-1.active:nth-child(1) .item {
background: #f42222;
color: #ffffff;
}
.grade .flex-1.active:nth-child(2) .item {
background: #f2b509;
color: #ffffff;
}
.grade .flex-1.active:nth-child(3) .item {
background: #999999;
color: #ffffff;
}
.icon-start {
color: #f5a623;
}
.evalu-value {
display: flex;
margin-bottom: 30rpx;
}
.eval {
display: flex;
justify-content: space-around;
align-items: center;
}
.evalu {
display: flex;
align-items: baseline;
flex-direction: column;
}
</style>