363 lines
8.6 KiB
Vue
363 lines
8.6 KiB
Vue
![]() |
<template>
|
|||
|
<view class="page flex flex-col">
|
|||
|
<view class="flex-1">
|
|||
|
<view class="title">对这款酒感觉如何?</view>
|
|||
|
<view class="content-box flex justify-between">
|
|||
|
|
|||
|
<textarea v-model="form.reviewContent" maxlength="100" placeholder="发布友好的评论..."
|
|||
|
class="textarea-box"></textarea>
|
|||
|
|
|||
|
<view class="flex align-center justify-center img-box" @click="handleUpload">
|
|||
|
|
|||
|
<image v-if="form.reviewImg" :src="form.reviewImg" style="width: 100%;height:100%"></image>
|
|||
|
|
|||
|
<text v-else class="upload-text">上传图片</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="num-box">
|
|||
|
<view class="tab-box">
|
|||
|
<view class="defTab" :class="{'active':currentTab == 1}" @click="changeTab(1)">快速评分</view>
|
|||
|
<view class="defTab" :class="{'active':currentTab == 2}" @click="changeTab(2)">细节评分</view>
|
|||
|
</view>
|
|||
|
<view v-if="currentTab == 1" class="quick-box">
|
|||
|
<view class="num">{{compositeScore}}</view>
|
|||
|
<view class="rate">
|
|||
|
<uni-rate :touchable="false" :readonly="true" v-model="compositeScore" />
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="slider-box">
|
|||
|
<slider min="0" max="5" step="1" :value="compositeScore" @change="sliderAllChange"
|
|||
|
activeColor="#FEE034" backgroundColor="#f2f2f2" block-color="#FEE034" block-size="18" />
|
|||
|
</view>
|
|||
|
<view class="sub">滑动模块,给这款酒评分</view>
|
|||
|
</view>
|
|||
|
<view v-if="currentTab == 2">
|
|||
|
<view class="item-label flex justify-between align-center">
|
|||
|
<text>颜色</text>
|
|||
|
<text>{{form.colorRating}}</text>
|
|||
|
</view>
|
|||
|
<view class="slider-box">
|
|||
|
<slider min="0" max="5" step="1" :value="form.colorRating"
|
|||
|
@change="e => sliderChange(e,'colorRating')" activeColor="#FEE034" backgroundColor="#f2f2f2"
|
|||
|
block-color="#FEE034" block-size="18" />
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="item-label flex justify-between align-center">
|
|||
|
<text>香味</text>
|
|||
|
<text>{{form.aromaRating}}</text>
|
|||
|
</view>
|
|||
|
<view class="slider-box">
|
|||
|
<slider min="0" max="5" step="1" :value="form.aromaRating"
|
|||
|
@change="e => sliderChange(e,'aromaRating')" activeColor="#FEE034" backgroundColor="#f2f2f2"
|
|||
|
block-color="#FEE034" block-size="18" />
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="item-label flex justify-between align-center">
|
|||
|
<text>口味</text>
|
|||
|
<text>{{form.tasteRating}}</text>
|
|||
|
</view>
|
|||
|
<view class="slider-box">
|
|||
|
<slider min="0" max="5" step="1" :value="form.tasteRating"
|
|||
|
@change="e => sliderChange(e,'tasteRating')" activeColor="#FEE034" backgroundColor="#f2f2f2"
|
|||
|
block-color="#FEE034" block-size="18" />
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="flex justify-center">
|
|||
|
<button class="cu-btn btn2" @click="anonymous">
|
|||
|
<image src="@/static/clipboard-tick.png" style="width: 48rpx;height: 48rpx;margin-right: 8rpx;"></image>
|
|||
|
匿名发布</button>
|
|||
|
<button class="cu-btn bg-zd btn" @click="submitForm">发布</button>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import {
|
|||
|
addReview
|
|||
|
} from '@/api/bar.js'
|
|||
|
import {
|
|||
|
base_url
|
|||
|
} from '@/api/config.js'
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
form: {
|
|||
|
beerId: '',
|
|||
|
reviewContent: '',
|
|||
|
reviewImg: '',
|
|||
|
aromaRating: 0, // 香味评分
|
|||
|
colorRating: 0, // 颜色评分
|
|||
|
tasteRating: 0, // 口味评分
|
|||
|
},
|
|||
|
compositeScore: 0,
|
|||
|
currentTab: 1,
|
|||
|
};
|
|||
|
},
|
|||
|
onLoad(options) {
|
|||
|
this.form.beerId = options.beerId
|
|||
|
},
|
|||
|
methods: {
|
|||
|
// 上传事件
|
|||
|
handleUpload() {
|
|||
|
// 读取 小程序已经授权的权限
|
|||
|
uni.getSetting({
|
|||
|
success:(res)=> {
|
|||
|
console.log(res)
|
|||
|
// 判断是否拥有此权限进行拉起授权 和 重新授权功能
|
|||
|
if (!res.authSetting['scope.camera']) {
|
|||
|
// 未授权此项权限 拉起授界面
|
|||
|
uni.authorize({
|
|||
|
scope: 'scope.camera',
|
|||
|
success:()=> {
|
|||
|
// 授权成功后 就可以执行 需要权限的 操作函数了
|
|||
|
this.startUpload()
|
|||
|
},
|
|||
|
fail:(err)=> {
|
|||
|
// 这里必须经过一个confirm 不然也会出现问题(啥问题我也不知道)
|
|||
|
uni.showModal({
|
|||
|
title: '是否重新授权拍照、相册的功能',
|
|||
|
success(res) {
|
|||
|
if (res.confirm) {
|
|||
|
uni.openSetting({
|
|||
|
success() {
|
|||
|
console.log('开启权限成功');
|
|||
|
},
|
|||
|
fail() {
|
|||
|
console.log('开启权限失败');
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
} else {
|
|||
|
this.startUpload()
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
},
|
|||
|
startUpload() {
|
|||
|
uni.chooseImage({
|
|||
|
count: 1,
|
|||
|
success: (res) => {
|
|||
|
uni.uploadFile({
|
|||
|
url: base_url + '/bar/common/upload', //仅为示例,非真实的接口地址
|
|||
|
filePath: res.tempFilePaths[0],
|
|||
|
name: 'file',
|
|||
|
formData: {
|
|||
|
type: 'image'
|
|||
|
},
|
|||
|
success: (uploadFileRes) => {
|
|||
|
this.form.reviewImg = JSON.parse(uploadFileRes.data).url
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
})
|
|||
|
},
|
|||
|
changeTab(index) {
|
|||
|
this.currentTab = index
|
|||
|
},
|
|||
|
sliderChange(e, key) {
|
|||
|
this.form[key] = +e.detail.value
|
|||
|
},
|
|||
|
sliderAllChange(e) {
|
|||
|
this.compositeScore = +e.detail.value
|
|||
|
this.form.aromaRating = +e.detail.value
|
|||
|
this.form.colorRating = +e.detail.value
|
|||
|
this.form.tasteRating = +e.detail.value
|
|||
|
},
|
|||
|
submitForm() {
|
|||
|
addReview(this.form).then(res => {
|
|||
|
if (res.code === 200) {
|
|||
|
uni.showToast({
|
|||
|
title: '评论成功',
|
|||
|
icon: 'success'
|
|||
|
})
|
|||
|
setTimeout(() => {
|
|||
|
uni.navigateBack()
|
|||
|
}, 1000)
|
|||
|
}
|
|||
|
})
|
|||
|
},
|
|||
|
// 匿名发布
|
|||
|
anonymous() {
|
|||
|
this.form.anonymous = true
|
|||
|
addReview(this.form).then(res => {
|
|||
|
if (res.code === 200) {
|
|||
|
uni.showToast({
|
|||
|
title: '评论成功',
|
|||
|
icon: 'success'
|
|||
|
})
|
|||
|
setTimeout(() => {
|
|||
|
uni.navigateBack()
|
|||
|
}, 1000)
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
/deep/ slider {
|
|||
|
margin: 0;
|
|||
|
}
|
|||
|
|
|||
|
/deep/ .wx-slider-handle-wrapper {
|
|||
|
margin: 0;
|
|||
|
height: 36rpx !important;
|
|||
|
}
|
|||
|
|
|||
|
.page {
|
|||
|
background-color: #f6f6f6;
|
|||
|
height: 100vh;
|
|||
|
padding-bottom: constant(safe-area-inset-bottom);
|
|||
|
padding-bottom: env(safe-area-inset-bottom);
|
|||
|
.title {
|
|||
|
font-family: Source Han Sans;
|
|||
|
font-size: 30rpx;
|
|||
|
font-weight: 500;
|
|||
|
line-height: 44rpx;
|
|||
|
color: #0B0E26;
|
|||
|
margin: 32rpx 30rpx;
|
|||
|
}
|
|||
|
|
|||
|
.content-box {
|
|||
|
border-radius: 20rpx;
|
|||
|
background: #FFFFFF;
|
|||
|
padding: 50rpx 30rpx;
|
|||
|
gap: 20rpx;
|
|||
|
margin-bottom: 32rpx;
|
|||
|
|
|||
|
.textarea-box {
|
|||
|
flex: 1;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
.img-box {
|
|||
|
flex-shrink: 0;
|
|||
|
width: 200rpx;
|
|||
|
height: 200rpx;
|
|||
|
background: #D8D8D8;
|
|||
|
border-radius: 20rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.num-box {
|
|||
|
border-radius: 20rpx;
|
|||
|
background: #FFFFFF;
|
|||
|
padding: 20rpx 30rpx;
|
|||
|
|
|||
|
.tab-box {
|
|||
|
border-radius: 30rpx;
|
|||
|
background: #F2F2F2;
|
|||
|
padding: 8rpx;
|
|||
|
margin: 0 32rpx 32rpx;
|
|||
|
display: flex;
|
|||
|
justify-content: space-between;
|
|||
|
|
|||
|
.defTab {
|
|||
|
width: 50%;
|
|||
|
border-radius: 30rpx;
|
|||
|
background: #F2F2F2;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
font-family: Source Han Sans;
|
|||
|
font-size: 32rpx;
|
|||
|
font-weight: 500;
|
|||
|
color: #0B0E26;
|
|||
|
padding: 16rpx 48rpx;
|
|||
|
}
|
|||
|
|
|||
|
.active {
|
|||
|
background-color: #71F4B4;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.item-label {
|
|||
|
font-family: Source Han Sans;
|
|||
|
font-size: 30rpx;
|
|||
|
font-weight: 500;
|
|||
|
line-height: 44rpx;
|
|||
|
color: #0B0E26;
|
|||
|
padding: 0 34rpx;
|
|||
|
margin-bottom: 18rpx;
|
|||
|
}
|
|||
|
|
|||
|
.slider-box {
|
|||
|
// background: #FEE034;
|
|||
|
background-color: #fff;
|
|||
|
border-radius: 20rpx;
|
|||
|
width: 100%;
|
|||
|
box-sizing: border-box;
|
|||
|
padding: 0 34rpx;
|
|||
|
margin-bottom: 34rpx;
|
|||
|
}
|
|||
|
|
|||
|
.quick-box {
|
|||
|
text-align: center;
|
|||
|
padding: 32rpx;
|
|||
|
|
|||
|
.num {
|
|||
|
font-family: Source Han Sans;
|
|||
|
font-size: 72rpx;
|
|||
|
font-weight: 500;
|
|||
|
line-height: 44rpx;
|
|||
|
color: #5F5F63;
|
|||
|
margin-bottom: 48rpx;
|
|||
|
}
|
|||
|
|
|||
|
.rate {
|
|||
|
margin-bottom: 32rpx;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
}
|
|||
|
|
|||
|
.slider-box {
|
|||
|
background-color: #FFF;
|
|||
|
border-radius: 20rpx;
|
|||
|
width: 100%;
|
|||
|
box-sizing: border-box;
|
|||
|
}
|
|||
|
|
|||
|
.sub {
|
|||
|
font-family: Source Han Sans;
|
|||
|
font-size: 32rpx;
|
|||
|
font-weight: 500;
|
|||
|
color: #9E9E9E;
|
|||
|
margin-top: 32rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.btn {
|
|||
|
// width: 654rpx;
|
|||
|
width: 344rpx;
|
|||
|
height: 88rpx;
|
|||
|
border-radius: 24rpx;
|
|||
|
// margin: 30rpx auto;
|
|||
|
font-size: 32rpx;
|
|||
|
font-weight: 500;
|
|||
|
color: #0B0E26;
|
|||
|
font-family: Roboto;
|
|||
|
font-weight: normal;
|
|||
|
text-align: center;
|
|||
|
}
|
|||
|
.btn2 {
|
|||
|
width: 240rpx;
|
|||
|
height: 80rpx;
|
|||
|
font-family: Roboto;
|
|||
|
font-size: 32rpx;
|
|||
|
text-align: center;
|
|||
|
border-radius: 24rpx;
|
|||
|
color: #0B0E26;
|
|||
|
background: #FFFFFF;
|
|||
|
margin-right: 66rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|