Feat(订单):增加视频上传

This commit is contained in:
lifizer
2024-04-16 18:00:12 +08:00
parent 01ff3035fe
commit b50f201637
6 changed files with 148 additions and 183 deletions
+16 -3
View File
@@ -1,9 +1,9 @@
<template> <template>
<view class="evaluateWtapper"> <view class="evaluateWtapper">
<view <view
class="evaluateItem"
v-for="(item, evaluateWtapperIndex) in reply" v-for="(item, evaluateWtapperIndex) in reply"
:key="evaluateWtapperIndex" :key="evaluateWtapperIndex"
class="evaluateItem"
> >
<view class="pic-text acea-row row-middle"> <view class="pic-text acea-row row-middle">
<view class="pictrue"> <view class="pictrue">
@@ -17,8 +17,21 @@
<view class="time">{{ item.createTime }} {{ item.sku||'' }}</view> <view class="time">{{ item.createTime }} {{ item.sku||'' }}</view>
<view class="evaluate-infor">{{ item.comment }}</view> <view class="evaluate-infor">{{ item.comment }}</view>
<view class="imgList acea-row"> <view class="imgList acea-row">
<view class="pictrue" v-for="(itemn, eq) in item.picturesArr" :key="eq"> <view v-if="item.video" class="pictrue">
<image :src="itemn" class="image" @click="previewImage(item.picturesArr,eq)" /> <video
:src="item.video"
:poster="item.video + '?vframe/jpg/offset/1'"
controls
play-btn-position="center"
class="image"
/>
</view>
<view
v-for="(itemn, eq) in item.picturesArr"
:key="eq"
class="pictrue"
>
<image :src="itemn" class="image" @click="previewImage(item.picturesArr, eq)" />
</view> </view>
</view> </view>
<view class="reply" v-if="item.merchantReplyContent"> <view class="reply" v-if="item.merchantReplyContent">
@@ -10,7 +10,10 @@
</view> </view>
</block> </block>
<view v-show="upload_before_list.length < upload_count" hover-class="sunui-uploader-hover" class="sunui-uploader-inputbox" @tap="choose" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'"> <view v-show="upload_before_list.length < upload_count" hover-class="sunui-uploader-hover" class="sunui-uploader-inputbox" @tap="choose" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'">
<view :style="'line-height:'+ upload_img_wh + 'rpx;'"><text class="iconfont icon-mn_shangchuantupian" style="color: #666;"></text></view> <view :style="'line-height:'+ upload_img_wh + 'rpx;'">
<text v-if="type === 'image'" class="iconfont icon-mn_shangchuantupian" style="color: #666;"></text>
<u-icon v-if="type === 'video'" size="48px" name="play-circle" style="color: #666;"></u-icon>
</view>
</view> </view>
</view> </view>
</view> </view>
@@ -106,34 +109,6 @@ export default {
}, },
mounted() { mounted() {
},
watch: {
// url(val) {
// this.upload_before_list.map((item) => {
// this.upload_cache_list.push(item.path);
// });
// this.emit();
// }
dataList:{
handler(val){
console.log('dataList change'+JSON.stringify(val));
this.upload_before_list = val;
if(this.upload_before_list.length>0){
this.upload_cache_list = [];
this.upload_before_list.map((item) => {
//
if(item.path.substring(0,4) == 'http' && item.path.substring(0,11) != 'http://tmp/')
{
this.upload_cache_list.push(item.path);
}
});
}else{
this.upload_cache_list = [];
}
this.emit();
},
immediate: true
}
}, },
methods: { methods: {
videoPlay(e) { videoPlay(e) {
@@ -378,7 +353,7 @@ export default {
} }
.icon-mn_shangchuantupian { .icon-mn_shangchuantupian {
font-size: 3em; font-size: 48px;
} }
.sunui-uploader-img { .sunui-uploader-img {
@@ -397,7 +372,7 @@ export default {
.sunui-uploader-inputbox { .sunui-uploader-inputbox {
position: relative; position: relative;
margin-bottom: 16rpx; margin: 0 16rpx 16rpx 0;
box-sizing: border-box; box-sizing: border-box;
background-color: #ededed; background-color: #ededed;
display: flex; display: flex;
+123 -146
View File
@@ -1,6 +1,9 @@
<template> <template>
<view class="evaluate-con"> <view class="evaluate-con">
<view class="goodsStyle acea-row row-between" v-if="orderCon.productInfo"> <view
v-if="orderCon.productInfo"
class="goodsStyle acea-row row-between"
>
<view class="pictrue"> <view class="pictrue">
<image :src="orderCon.productInfo.image" class="image"/> <image :src="orderCon.productInfo.image" class="image"/>
</view> </view>
@@ -14,77 +17,83 @@
</view> </view>
<view class="score"> <view class="score">
<view <view
class="item acea-row row-middle" v-for="(item, scoreListIndexw) in scoreList"
v-for="(item, scoreListIndexw) in scoreList" :key="scoreListIndexw"
:key="scoreListIndexw" class="item acea-row row-middle"
> >
<view>{{ item.name }}</view> <view>{{ item.name }}</view>
<view class="starsList"> <view class="starsList">
<text <text
@click="stars(starsIndexn, scoreListIndexw)" v-for="(itemn, starsIndexn) in item.stars"
v-for="(itemn, starsIndexn) in item.stars" :key="starsIndexn"
:key="starsIndexn" :class="item.index >= starsIndexn ? 'icon-shitixing font-color-red' : 'icon-kongxinxing'"
class="iconfont" class="iconfont"
:class="item.index >= starsIndexn ? 'icon-shitixing font-color-red': 'icon-kongxinxing'" @click="stars(starsIndexn, scoreListIndexw)"
></text> />
</view> </view>
<text class="evaluate">{{ item.index === -1 ? "" : item.index + 1 + "分" }}</text> <text class="evaluate">{{ item.index === -1 ? "" : item.index + 1 + "分" }}</text>
</view> </view>
<view class="textarea"> <view class="textarea">
<textarea placeholder="商品满足你的期待么?说说你的想法,分享给想买的他们吧~" v-model="expect"></textarea> <textarea
v-model="expect"
<u-upload placeholder="商品满足你的期待么?说说你的想法,分享给想买的他们吧~"
:fileList="uploadPictures" />
@afterRead="afterRead" <view class="upload-title">
@delete="deletePic" 添加视频/图片
name="uploadPictures" <text class="txt">
multiple ({{ videoArr.length + picArr.length }}/9)
:maxCount="9" </text>
></u-upload> </view>
<!-- <view class="list acea-row row-middle">--> <view class="upload-wrapper">
<!-- <view--> <tm-upload
<!-- class="pictrue"--> :dataList="videoArr"
<!-- v-for="(item, uploadPicturesIndex) in uploadPictures"--> :upload_img_wh="uploadImgWH"
<!-- :key="uploadPicturesIndex"--> :upload_max="1"
<!-- >--> :upload_count="1"
<!-- <image :src="item"/>--> :url="uploadUrl"
<!-- <text--> :header="uploadHeader"
<!-- class="iconfont icon-guanbi1 font-color-red"--> type='video'
<!-- @click="uploadPictures.splice(uploadPicturesIndex, 1)"--> @change="uploadedVideoChange"
<!-- ></text>--> />
<!-- </view>--> <tm-upload
<!-- <view class="pictrue uploadBnt acea-row row-center-wrapper row-column" @tap="chooseImage">--> :dataList="picArr"
<!-- <text class="iconfont icon-icon25201"></text>--> :upload_img_wh="uploadImgWH"
<!-- <view>上传图片</view>--> :upload_max="9 - videoArr.length"
<!-- </view>--> :upload_count="9 - videoArr.length"
<!-- </view>--> :url="uploadUrl"
:header="uploadHeader"
type='image'
@change="uploadedPicChange"
/>
</view>
</view> </view>
<view class="evaluateBnt bg-color-red" @click="submit">立即评价</view> <view class="evaluateBnt bg-color-red" @click="submit">立即评价</view>
</view> </view>
</view> </view>
</template> </template>
<style scoped lang="less">
.evaluate-con .score .textarea .list .pictrue.uploadBnt {
border: 1px solid #ddd;
}
</style>
<script> <script>
import {postOrderComment, postOrderProduct} from "@/api/store"; import { postOrderComment, postOrderProduct } from '@/api/store'
import {trim, uploadImage} from "@/utils"; import { trim } from '@/utils'
import {required} from "@/utils/validate"; import { required } from '@/utils/validate'
import {validatorDefaultCatch} from "@/utils/dialog"; import { validatorDefaultCatch } from '@/utils/dialog'
import tmUpload from '@/components/tm-upload/tm-upload.vue'
const NAME = "GoodsEvaluate"; import {
VUE_APP_API_URL
} from '@/config'
export default { export default {
name: NAME, name: 'GoodsEvaluate',
components: { components: {
// VueCoreImageUpload tmUpload
}, },
props: {}, props: {},
data: function () { data: function () {
return { return {
uploadUrl: VUE_APP_API_URL + '/api/upload',
uploadImgWH: (750 - 3 * 16 - 2 * 32 - 16) / 3.0,
uploadHeader: {
Authorization: "Bearer " + this.$store.getters.token
},
orderCon: { orderCon: {
cartProduct: { cartProduct: {
productInfo: {} productInfo: {}
@@ -92,136 +101,104 @@ export default {
}, },
scoreList: [ scoreList: [
{ {
name: "商品质量", name: '商品质量',
stars: ["", "", "", "", ""], stars: ['', '', '', '', ''],
index: -1 index: -1
}, },
{ {
name: "服务态度", name: '服务态度',
stars: ["", "", "", "", ""], stars: ['', '', '', '', ''],
index: -1 index: -1
} }
], ],
uploadPictures: [], uploadPictures: [],
expect: "", expect: '',
unique: "" unique: '',
}; picArr: [],
}, videoArr: []
mounted: function () {
this.unique = this.$yroute.query.id;
this.getOrderProduct();
},
watch: {
$yroute(n) {
if (n.name === NAME && this.unique !== n.params.id) {
this.unique = n.params.id;
this.$set(this.scoreList[0], "index", -1);
this.$set(this.scoreList[1], "index", -1);
this.expect = "";
this.uploadPictures = [];
this.getOrderProduct();
}
} }
}, },
mounted() {
this.unique = this.$yroute.query.id
this.getOrderProduct()
},
methods: { methods: {
getOrderProduct: function () { getOrderProduct() {
let that = this, postOrderProduct(this.unique).then(res => {
unique = that.unique; this.orderCon = res.data
postOrderProduct(unique).then(res => { })
that.orderCon = res.data;
});
}, },
stars: function (indexn, indexw) { stars: function (indexn, indexw) {
this.scoreList[indexw].index = indexn; this.scoreList[indexw].index = indexn
}, },
// chooseImage() { uploadedVideoChange(uploadList) {
// chooseImage(img => { this.videoArr = uploadList
// this.uploadPictures.push(img);
// });
// },
// 删除图片
deletePic(event) {
this[`${event.name}`].splice(event.index, 1)
}, },
uploadedPicChange(uploadList) {
afterRead(event) { this.picArr = uploadList
let that = this;
if (event.file.length > 0) {
event.file.map(item => {
uploadImage(item.url, img => {
that.uploadPictures.push({url: img})
})
})
}
}, },
async submit() { async submit() {
const expect = trim(this.expect), const expect = trim(this.expect)
product_score = const product_score = this.scoreList[0].index + 1 === 0 ? "" : this.scoreList[0].index + 1
this.scoreList[0].index + 1 === 0 ? "" : this.scoreList[0].index + 1, const service_score = this.scoreList[1].index + 1 === 0 ? "" : this.scoreList[1].index + 1
service_score =
this.scoreList[1].index + 1 === 0 ? "" : this.scoreList[1].index + 1;
try { try {
await this.$validator({ await this.$validator({
product_score: [ product_score: [
required("请选择商品质量分数", { required('请选择商品质量分数', {
type: "number" type: 'number'
}) })
], ],
service_score: [ service_score: [
required("请选择服务态度分数", { required('请选择服务态度分数', {
type: "number" type: 'number'
}) })
] ]
}).validate({ }).validate({
product_score, product_score,
service_score service_score
}); })
} catch (e) { } catch (e) {
return validatorDefaultCatch(e); return validatorDefaultCatch(e)
} }
let temp = this.uploadPictures.map(item => item.url)
let pics = temp.join(",")
postOrderComment({ postOrderComment({
productScore: product_score, productScore: product_score,
serviceScore: service_score, serviceScore: service_score,
unique: this.unique, unique: this.unique,
pics, pics: this.picArr.join(','),
comment: expect comment: expect,
video: this.videoArr.join(',')
}).then(() => {
uni.showToast({
title: '评价成功',
icon: 'success',
duration: 2000
})
this.$yrouter.back()
}).catch(err => {
uni.showToast({
title: err.msg || err.response.data.msg || err.response.data.message,
icon: 'none',
duration: 2000
})
}) })
.then(() => {
uni.showToast({
title: "评价成功",
icon: "success",
duration: 2000
});
// ? 回跳到上一页
this.$yrouter.back();
// ? 默认跳转到详情页
// this.$yrouter.push({
// path: "/pages/order/OrderDetails/index",
// query: {
// id: this.orderCon.orderId
// }
// });
// ? 可选重定向到详情页,这时左上角会有一个返回首页的图标
// this.$yrouter.reLaunch({
// path: "/pages/home/index",
// });
})
.catch(err => {
uni.showToast({
title:
err.msg || err.response.data.msg || err.response.data.message,
icon: "none",
duration: 2000
});
});
} }
} }
}; };
</script> </script>
<style scoped lang="less">
.upload-title {
padding: 0 0 20rpx 16rpx;
.txt {
color: #999;
font-size: 22rpx;
}
}
.upload-wrapper {
display: flex;
flex-wrap: wrap;
padding: 0 0 0 16rpx;
}
.evaluate-con .score .textarea .list .pictrue.uploadBnt {
border: 1px solid #ddd;
}
</style>
+1 -1
View File
@@ -216,7 +216,7 @@
<script> <script>
import CitySelect from "@/components/CitySelect"; import CitySelect from "@/components/CitySelect";
import tmUpload from '@/pagesInn/components/tm-upload/tm-upload.vue'; import tmUpload from '@/components/tm-upload/tm-upload.vue';
import {getCity} from "@/api/user"; import {getCity} from "@/api/user";
import {chooseImage, isWeixin} from "@/utils"; import {chooseImage, isWeixin} from "@/utils";
import {getHomeData} from "@/api/public"; import {getHomeData} from "@/api/public";
+1 -1
View File
@@ -65,7 +65,7 @@
</template> </template>
<script> <script>
import tmUpload from '@/pagesInn/components/tm-upload/tm-upload.vue' import tmUpload from '@/components/tm-upload/tm-upload.vue'
import { import {
VUE_APP_API_URL VUE_APP_API_URL
} from '@/config' } from '@/config'
+1 -1
View File
@@ -131,7 +131,7 @@
<script> <script>
import CitySelect from '@/components/CitySelect' import CitySelect from '@/components/CitySelect'
import tmUpload from '@/pagesInn/components/tm-upload/tm-upload.vue' import tmUpload from '@/components/tm-upload/tm-upload.vue'
import { import {
chooseImage, chooseImage,
chooseVideoToUpload chooseVideoToUpload