zdtap-uniapp-main/pages/index/writeReview.vue

363 lines
8.6 KiB
Vue
Raw Normal View History

2025-04-03 11:47:12 +08:00
<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>