<template> <view :style="viewColor"> <view class="tips" v-if="is_open_service == 1 && service"> <view class="tipBox" @click="toChat"> <view class="left"> <image :src="`${domain}/static/images/kefu.png`" mode=""></image> <view class="font">如需尽快解决问题,可直接联系在线客服</view> </view> <view><i class='iconfont icon-xiangyou' style="fontSize: 24rpx;"></i></view> </view> </view> <view class="feedback-container"> <view class="item-box"> <view class="title-box"> <text>*</text>反馈类型 </view> <view class="tab-box" v-if="tabList.length>0"> <block v-for="(item,index) in tabList"> <view class="tab-item" :key="index" :class="{'active':index == tabKey}" @click="bindTab(item,index)">{{item.cate_name}}</view> </block> </view> <view class="picker" v-if="qsArray.length>0"> <picker @change="bindPickerChange" :value="qsIndex" :range="qsArray" range-key="cate_name"> <view class="picker-box"> {{qsArray[qsIndex]['cate_name']}} <text class="iconfont icon-xiangxia"></text> </view> </picker> </view> </view> <view class="item-box"> <view class="title-box"> <text>*</text>反馈内容 </view> <view class="textarea-box"> <textarea maxlength="200" placeholder="请输入文字" v-model="con" /> <view class="num">{{con.length}}/200字</view> </view> </view> <view class="item-box"> <view class="title-box"> <text>*</text>图片上传 <text class="des">(上传聊天截图或与问题描述相关的图片)</text> </view> <view class="upload-img"> <view class="img-wrapper" v-if="uploadImg.length>0" v-for="(item,index) in uploadImg"> <image :src="item"></image> <view class="iconfont icon-guanbi1" @click="deleteImg(index)"></view> </view> <view class="add-img" @click="uploadpic" v-if="isUpload"> <text class="iconfont icon-xiangji"></text> </view> </view> </view> <view class="item-box"> <view class="title-box"> <text>*</text>联系方式 </view> <view class="input-box"> <input type="text" placeholder="请填写您的姓名" v-model="name"> <input type="text" placeholder="请填写您的电话或邮箱" v-model="phone"> </view> </view> <view class="item-box"> <view class="sub-btn" @click="bindSub">提交反馈</view> <navigator url="/pages/users/feedback/list" class="link" hover-class="none">反馈记录 <text class="iconfont icon-xiangyou"></text></navigator> </view> <view class="success" v-if="isShowbox"> <view class="bg"></view> <view class="con"> <image :src="domain+'/static/diy/success'+keyColor+'.png'" mode=""></image> <view class="text">反馈提交成功</view> <view class="btn" @click="close">我知道了</view> </view> </view> </view> </view> </template> <script> // +---------------------------------------------------------------------- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ] // +---------------------------------------------------------------------- // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved. // +---------------------------------------------------------------------- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 // +---------------------------------------------------------------------- // | Author: CRMEB Team <admin@crmeb.com> // +---------------------------------------------------------------------- import { feedbackType, feedback, hasServiceApi} from '@/api/user.js' import { checkPhone,isEmailAvailable } from '@/utils/validate.js' import { mapGetters } from "vuex"; import { HTTP_REQUEST_URL } from '@/config/app'; import { configMap } from '@/utils'; export default { data() { return { domain: HTTP_REQUEST_URL, // 反馈类型 tabList: [], // 反馈类型key tabKey: 0, // 反馈列表 qsArray: [], // 反馈index qsIndex: 0, // 反馈内容 con: '', uploadImg: [], name: '', phone: '', isShowbox: false, isUpload: true, service: false, } }, computed:{ ...configMap(['is_open_service'], mapGetters(['viewColor', 'keyColor'])) }, watch: { uploadImg(nVal, oVal) { this.isUpload = nVal.length < 6 ? true : false } }, onLoad() { this.hasService() // 获取反馈类型 feedbackType().then(({ data }) => { this.tabList = data this.getFeedBack(data) }) }, methods: { toChat(){ uni.navigateTo({ url: `/pages/chat/customer_list/chat?mer_id=0` }) }, /*判断店铺是否有在线客服*/ hasService(){ hasServiceApi(0).then(res => { this.service = true; }).catch(err => { this.service = false; }); }, // 获取含有二级分类的反馈类型 getFeedBack(data) { let that = this; data.forEach(function(item, i) { if (item.children) { that.tabKey = i; that.qsArray = data[that.tabKey].children return; } }); }, // 下拉选中 bindPickerChange(e) { this.qsIndex = e.target.value }, // tab切换 bindTab(item, index) { this.tabKey = index this.qsIndex = 0 this.qsArray = this.tabList[this.tabKey].children ? this.tabList[this.tabKey].children : [] }, /** * 上传文件 * */ uploadpic: function() { let that = this; that.$util.uploadImageOne('upload/image', function(res) { console.log(res, '回调') that.uploadImg.push(res.data.path); that.$set(that, 'uploadImg', that.uploadImg); }); }, // 弹窗关闭 close() { this.con = '' this.uploadImg = [] this.name = '' this.phone = '' this.isShowbox = false }, // 删除图片 deleteImg(index) { this.uploadImg.splice(index, 1) }, // 提交反馈 bindSub() { if (!this.con) { uni.showToast({ title: '请输入反馈内容', icon: 'none' }) return } if (this.uploadImg.length == 0) { uni.showToast({ title: '请上传图片', icon: 'none' }) return } if (!this.name) { uni.showToast({ title: '请输入姓名', icon: 'none' }) return } if (!this.phone) { uni.showToast({ title: '请输入电话或者邮箱', icon: 'none' }) return } if (!isEmailAvailable(this.phone) && !checkPhone(this.phone)) { uni.showToast({ title: '请输入有效的电话或者邮箱', icon: 'none' }) return } feedback({ type: (this.qsArray[this.qsIndex] && this.qsArray[this.qsIndex].feedback_category_id) || 0, content: this.con, images: this.uploadImg, realname: this.name, contact: this.phone }).then(res => { this.isShowbox = true }).catch(error => { this.$util.Tips({ title: error }) }) } } } </script> <style lang="scss"> page { width: 100%; background-color: #fff; } .tips { background-color: #f1f1f1; padding: 20rpx; .tipBox { width: 100%; height: 100rpx; background: var(--view-minorColor); border-radius: 16rpx; line-height: 100rpx; display: flex; justify-content: space-between; font-size: 24rpx; font-weight: 400; color: var(--view-theme); padding: 0rpx 30rpx; .left { display: flex; image { width: 70rpx; height: 70rpx; background: #FFFFFF; border-radius: 50%; display: inline-block; margin-top: 15rpx; } .font { padding-left: 20rpx; } } } } .feedback-container { padding: 30rpx; .item-box { margin-bottom: 40rpx; .title-box { font-size: 28rpx; color: #222222; text { margin-right: 10rpx; color: var(--view-theme); } .des { margin-left: 10rpx; font-size: 22rpx; color: #999999; } } .tab-box { margin-top: 20rpx; display: flex; flex-wrap: wrap; .tab-item { line-height: 66rpx; align-items: center; justify-content: center; width: 200rpx; margin-right: 20rpx; margin-bottom: 20rpx; border: 1px solid #BFBFBF; border-radius: 33px; font-size: 28rpx; text-align: center; &.active { background: var(--view-theme); color: #fff; border-color: var(--view-theme); } } } .picker { margin-top: 30rpx; .picker-box { position: relative; width: 100%; height: 90rpx; line-height: 90rpx; padding: 0 30rpx; background-color: #F5F5F5; border-radius: 10rpx; .iconfont { position: absolute; right: 30rpx; top: 50%; transform: translateY(-50%); font-size: 22rpx; color: var(--view-theme); } } } .textarea-box { background: #F5F5F5; border-radius: 10rpx; textarea { width: 100%; height: 300rpx; margin-top: 30rpx; padding: 20rpx 20rpx 0; font-size: 28rpx; line-height: 1.5; } .num { color: #999; text-align: right; padding: 20rpx; } } .upload-img { display: flex; flex-wrap: wrap; .img-wrapper { position: relative; display: flex; flex-wrap: wrap; margin: 30rpx 20rpx 20rpx 0; width: 158rpx; height: 158rpx; image { width: 158rpx; height: 158rpx; } .iconfont { position: absolute; right: -15rpx; top: -20rpx; font-size: 40rpx; color: var(--view-theme); } &:nth-child(4n) { margin-right: 0; } } .add-img { display: flex; align-items: center; justify-content: center; width: 158rpx; height: 158rpx; background: #F5F5F5; border-radius: 10rpx; margin-top: 30rpx; margin-bottom: 20rpx; .iconfont { color: #B5B5B5; font-size: 55rpx; } } } .input-box { input { display: block; width: 100%; height: 90rpx; margin-top: 20rpx; padding-left: 20rpx; background: #f5f5f5; border-radius: 10rpx; font-size: 28rpx; } } .sub-btn { height: 90rpx; line-height: 90rpx; background: var(--view-theme); color: #fff; font-size: 32rpx; text-align: center; border-radius: 45rpx; } .link { display: flex; align-items: center; justify-content: center; margin-top: 20rpx; .iconfont { margin-top: 6rpx; font-size: 22rpx; } } } .success { z-index: 10; position: fixed; left: 0; top: 0; width: 100%; height: 100%; .bg { position: absolute; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, .5); } .con { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: flex; flex-direction: column; align-items: center; justify-content: center; width: 500rpx; height: 540rpx; background: #fff; border-radius: 10rpx; font-size: 34rpx; color: #282828; image { width: 149rpx; height: 230rpx; } .btn { width: 340rpx; height: 90rpx; line-height: 90rpx; margin-top: 38rpx; text-align: center; color: #fff; background-image: linear-gradient(-90deg, var(--view-bntColor21) 0%, var(--view-bntColor22) 100%); border-radius: 45rpx; } } } } </style>