|
@@ -7,8 +7,8 @@
|
|
<view class="text2">好评率 <text>{{info.rate||100}}%</text></view>
|
|
<view class="text2">好评率 <text>{{info.rate||100}}%</text></view>
|
|
</view>
|
|
</view>
|
|
<view class="one_2">
|
|
<view class="one_2">
|
|
- <view class="one_2_1" v-for="(item,index) in btnlist" :key="index">
|
|
|
|
- <text>{{item.name}}</text><text>({{item.num||0}})</text>
|
|
|
|
|
|
+ <view class="one_2_1" v-for="(item,index) in btnlist" :key="index" @tap="toSelect(item)">
|
|
|
|
+ <text>{{item.name}}</text><text>({{item.total||0}})</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
@@ -16,20 +16,35 @@
|
|
<scroll-view scroll-y="true" class="scroll-view" @scrolltolower="toPage">
|
|
<scroll-view scroll-y="true" class="scroll-view" @scrolltolower="toPage">
|
|
<view class="list-scroll-view">
|
|
<view class="list-scroll-view">
|
|
<view class="list" v-for="(item, index) in list" :key="index">
|
|
<view class="list" v-for="(item, index) in list" :key="index">
|
|
- <image v-if="item.file&&item.file.length>0" class="image"
|
|
|
|
- :src="item.file&&item.file.length>0?item.file[0].url:''" mode="">
|
|
|
|
|
|
+ <image v-if="item.customer.icon&&item.customer.icon.length>0" class="image"
|
|
|
|
+ :src="item.customer.icon&&item.customer.icon.length>0?item.customer.icon[0].url:''"
|
|
|
|
+ mode="">
|
|
</image>
|
|
</image>
|
|
<text v-else class="iconfont icon-top"></text>
|
|
<text v-else class="iconfont icon-top"></text>
|
|
<view class="list_1">
|
|
<view class="list_1">
|
|
<view class="other">
|
|
<view class="other">
|
|
- <text>{{item.phone}}</text>
|
|
|
|
- <text>{{item.time}}</text>
|
|
|
|
|
|
+ <text>{{item.customer.phone}}</text>
|
|
|
|
+ <text>{{item.reply[0].time||'暂无'}}</text>
|
|
|
|
+ </view>
|
|
|
|
+ <view class="flie">
|
|
|
|
+ <view v-for="(tag, indexs) in item.reply[0].file" :key="indexs">
|
|
|
|
+ <image @click="toLarge(item,indexs)" class="images" :src="tag.url" mode="">
|
|
|
|
+ </image>
|
|
|
|
+ </view>
|
|
</view>
|
|
</view>
|
|
<view class="stars">
|
|
<view class="stars">
|
|
- <uni-rate size="18" :readonly="true" :value="5" />
|
|
|
|
|
|
+ <uni-rate size="18" :readonly="true" :value="item.goods_score" />
|
|
|
|
+ </view>
|
|
|
|
+ <view class="other1">{{item.reply[0].content||'暂无'}}</view>
|
|
|
|
+ <view class="other2">规格:{{item.goodsSpec.name}}</view>
|
|
|
|
+ <view class="other2" v-for="(itm, indexx) in item.reply" :key="indexx">
|
|
|
|
+ <view class="reply">
|
|
|
|
+ <text>用户评论:{{itm.content||'暂无'}}</text>
|
|
|
|
+ <text v-if="itm.reply">商家回复:{{itm.reply||'暂无'}}</text>
|
|
|
|
+ </view>
|
|
|
|
+ <view @tap="toReply(item)">回复</view>
|
|
</view>
|
|
</view>
|
|
- <view class="other1">{{item.content}}</view>
|
|
|
|
- <view class="other2">规格:{{item.specs}}</view>
|
|
|
|
|
|
+ <input v-if="reply.reply" @confirm="confirm" class="input" placeholder="回复商家" />
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
@@ -40,6 +55,7 @@
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
|
+ import moment from 'moment';
|
|
export default {
|
|
export default {
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
@@ -47,55 +63,36 @@
|
|
user: {},
|
|
user: {},
|
|
btnlist: [{
|
|
btnlist: [{
|
|
name: '全部好评',
|
|
name: '全部好评',
|
|
- num: '10',
|
|
|
|
|
|
+ total: '0',
|
|
code: '0'
|
|
code: '0'
|
|
},
|
|
},
|
|
{
|
|
{
|
|
name: '好评',
|
|
name: '好评',
|
|
- num: '10',
|
|
|
|
- code: '0'
|
|
|
|
|
|
+ total: '0',
|
|
|
|
+ code: '1'
|
|
},
|
|
},
|
|
{
|
|
{
|
|
name: '中评',
|
|
name: '中评',
|
|
- num: '0',
|
|
|
|
- code: '0'
|
|
|
|
|
|
+ total: '0',
|
|
|
|
+ code: '2'
|
|
},
|
|
},
|
|
{
|
|
{
|
|
name: '差评',
|
|
name: '差评',
|
|
- num: '0',
|
|
|
|
- code: '0'
|
|
|
|
|
|
+ total: '0',
|
|
|
|
+ code: '3'
|
|
}
|
|
}
|
|
],
|
|
],
|
|
info: {},
|
|
info: {},
|
|
- list: [{
|
|
|
|
- phone: '150********',
|
|
|
|
- content: '好评!',
|
|
|
|
- specs: '标准',
|
|
|
|
- time: '2022-10-04 06:35:10'
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- phone: '132********',
|
|
|
|
- content: '好评!',
|
|
|
|
- specs: '标准',
|
|
|
|
- time: '2022-10-06 16:09:20'
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- phone: '188********',
|
|
|
|
- content: '好评!',
|
|
|
|
- specs: '标准',
|
|
|
|
- time: '2022-10-07 16:15:08'
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- phone: '137********',
|
|
|
|
- content: '好评!',
|
|
|
|
- specs: '标准',
|
|
|
|
- time: '2022-10-07 14:26:10'
|
|
|
|
- }
|
|
|
|
- ],
|
|
|
|
|
|
+ list: [],
|
|
total: 0,
|
|
total: 0,
|
|
skip: 0,
|
|
skip: 0,
|
|
limit: 6,
|
|
limit: 6,
|
|
- page: 0
|
|
|
|
|
|
+ page: 0,
|
|
|
|
+ one: [],
|
|
|
|
+ two: [],
|
|
|
|
+ thr: [],
|
|
|
|
+ // 回复数据
|
|
|
|
+ reply: {},
|
|
};
|
|
};
|
|
},
|
|
},
|
|
onLoad: function(e) {
|
|
onLoad: function(e) {
|
|
@@ -104,6 +101,55 @@
|
|
that.watchLogin()
|
|
that.watchLogin()
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
|
|
+ async confirm(e) {
|
|
|
|
+ const that = this;
|
|
|
|
+ let reply = that.reply
|
|
|
|
+ let obj = {
|
|
|
|
+ content: e.detail.value,
|
|
|
|
+ time: moment().format('YYYY-MM-DD HH:mm:ss')
|
|
|
|
+ }
|
|
|
|
+ reply.reply.push(obj)
|
|
|
|
+ const arr = await that.$api(`/goodsRate/${that.reply._id}`, 'POST', reply)
|
|
|
|
+ if (arr.errcode == '0') {
|
|
|
|
+ uni.showToast({
|
|
|
|
+ title: `回复成功`,
|
|
|
|
+ icon: 'success',
|
|
|
|
+ });
|
|
|
|
+ that.$set(that, `reply`, {});
|
|
|
|
+ } else {
|
|
|
|
+ uni.showToast({
|
|
|
|
+ title: arr.errmsg,
|
|
|
|
+ icon: 'none',
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ // 回复
|
|
|
|
+ toReply(e) {
|
|
|
|
+ const that = this;
|
|
|
|
+ that.$set(that, `reply`, e);
|
|
|
|
+ },
|
|
|
|
+ // 放大
|
|
|
|
+ toLarge(e, index) {
|
|
|
|
+ let url = e.reply[0].file.map(item => item.url)
|
|
|
|
+ uni.previewImage({
|
|
|
|
+ current: index,
|
|
|
|
+ urls: url
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ // 选择
|
|
|
|
+ toSelect(e) {
|
|
|
|
+ const that = this;
|
|
|
|
+ if (e.code == '0') {
|
|
|
|
+ that.clearPage();
|
|
|
|
+ that.search()
|
|
|
|
+ } else if (e.code == '1') {
|
|
|
|
+ that.$set(that, `list`, that.one);
|
|
|
|
+ } else if (e.code == '2') {
|
|
|
|
+ that.$set(that, `list`, that.two);
|
|
|
|
+ } else {
|
|
|
|
+ that.$set(that, `list`, that.thr);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
// 监听用户是否登录
|
|
// 监听用户是否登录
|
|
watchLogin() {
|
|
watchLogin() {
|
|
const that = this;
|
|
const that = this;
|
|
@@ -125,12 +171,43 @@
|
|
async search() {
|
|
async search() {
|
|
const that = this;
|
|
const that = this;
|
|
let user = that.user;
|
|
let user = that.user;
|
|
- let res = await that.$api(`/viewGoods/goodsDetail`, `POST`, {
|
|
|
|
|
|
+ let res;
|
|
|
|
+ res = await that.$api(`/viewGoods/goodsDetail`, `POST`, {
|
|
id: that.id
|
|
id: that.id
|
|
});
|
|
});
|
|
if (res.errcode == '0') {
|
|
if (res.errcode == '0') {
|
|
that.$set(that, `info`, res.data)
|
|
that.$set(that, `info`, res.data)
|
|
}
|
|
}
|
|
|
|
+ let info = {
|
|
|
|
+ skip: that.skip,
|
|
|
|
+ limit: that.limit,
|
|
|
|
+ goods: that.id
|
|
|
|
+ }
|
|
|
|
+ res = await that.$api(`/goodsRate`, `GET`, {
|
|
|
|
+ ...info,
|
|
|
|
+ })
|
|
|
|
+ if (res.errcode == '0') {
|
|
|
|
+ let list = [...that.list, ...res.data]
|
|
|
|
+ for (let val of list) {
|
|
|
|
+ val.customer.phone = val.customer.phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
|
|
|
|
+ }
|
|
|
|
+ let one = list.filter(item => item.goods_score == 5);
|
|
|
|
+ that.$set(that, `one`, one)
|
|
|
|
+ that.$set(that.btnlist[1], `total`, one.length);
|
|
|
|
+ let two = list.filter(item => item.goods_score < 5 && item.goods_score > 2)
|
|
|
|
+ that.$set(that, `two`, two)
|
|
|
|
+ that.$set(that.btnlist[2], `total`, two.length);
|
|
|
|
+ let thr = list.filter(item => item.goods_score <= 2)
|
|
|
|
+ that.$set(that, `thr`, thr)
|
|
|
|
+ that.$set(that.btnlist[3], `total`, thr.length);
|
|
|
|
+ that.$set(that, `list`, list)
|
|
|
|
+ that.$set(that, `total`, res.total)
|
|
|
|
+ that.$set(that.btnlist[0], `total`, res.total)
|
|
|
|
+ } else {
|
|
|
|
+ uni.showToast({
|
|
|
|
+ title: res.errmsg,
|
|
|
|
+ });
|
|
|
|
+ }
|
|
},
|
|
},
|
|
// 分页
|
|
// 分页
|
|
toPage(e) {
|
|
toPage(e) {
|
|
@@ -149,7 +226,8 @@
|
|
that.search();
|
|
that.search();
|
|
uni.hideLoading();
|
|
uni.hideLoading();
|
|
} else uni.showToast({
|
|
} else uni.showToast({
|
|
- title: '没有更多数据了'
|
|
|
|
|
|
+ title: '没有更多数据了',
|
|
|
|
+ icon: 'none'
|
|
});
|
|
});
|
|
},
|
|
},
|
|
// 清空列表
|
|
// 清空列表
|
|
@@ -218,6 +296,13 @@
|
|
margin: 0 0 2vw 0;
|
|
margin: 0 0 2vw 0;
|
|
padding: 4vw;
|
|
padding: 4vw;
|
|
|
|
|
|
|
|
+ .image {
|
|
|
|
+ width: 10vw;
|
|
|
|
+ height: 10vw;
|
|
|
|
+ border-radius: 10vw;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
.iconfont {
|
|
.iconfont {
|
|
font-size: 30px;
|
|
font-size: 30px;
|
|
}
|
|
}
|
|
@@ -241,10 +326,30 @@
|
|
margin: 1vw 0 0 0;
|
|
margin: 1vw 0 0 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ .flie {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ margin: 1vw 0;
|
|
|
|
+
|
|
|
|
+ .images {
|
|
|
|
+ width: 20vw;
|
|
|
|
+ height: 20vw;
|
|
|
|
+ margin: 0 1vw 0 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
.other2 {
|
|
.other2 {
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
font-size: var(--font12Size);
|
|
font-size: var(--font12Size);
|
|
color: var(--f85Color);
|
|
color: var(--f85Color);
|
|
margin: 2vw 0 0 0;
|
|
margin: 2vw 0 0 0;
|
|
|
|
+
|
|
|
|
+ .reply {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ width: 70vw;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|