<template> <view class="page"> <view class="feedback-title"> <text>问题和意见</text> <text class="feedback-quick" @tap="chooseMsg">快速键入</text> </view> <view class="feedback-body"><textarea placeholder="请详细描述你的问题和意见..." v-model="sendDate.content" class="feedback-textare"></textarea></view> <view class="feedback-title"><text>图片(选填,提供问题截图,总大小10M以下)</text></view> <view class="feedback-body feedback-uploader"> <view class="uni-uploader"> <view class="uni-uploader-head"> <view class="uni-uploader-title">点击预览图片</view> <view class="uni-uploader-info">{{ imageList.length }}/5</view> </view> <view class="uni-uploader-body"> <view class="uni-uploader__files"> <block v-for="(image, index) in imageList" :key="index"> <view class="uni-uploader__file" style="position: relative;"> <image class="uni-uploader__img" :src="image" @tap="previewImage(index)"></image> <view class="close-view" @click="close(index)">x</view> </view> </block> <view class="uni-uploader__input-box" v-show="imageList.length < 5"> <view class="uni-uploader__input" @tap="chooseImg"></view> </view> </view> </view> </view> </view> <view class="feedback-title"><text>联系方式(手机或者邮箱)</text></view> <view class="feedback-body"><input class="feedback-input" v-model="sendDate.contact" placeholder="(选填,方便我们联系你 )" /></view> <view class="feedback-title feedback-star-view"> <text>应用评分</text> <view class="feedback-star-view"> <uni-rate v-model="sendDate.score" color="#bbb"></uni-rate> </view> </view> <button type="default" class="feedback-submit" @tap="send">提交</button> </view> </template> <script> export default { components: {}, data() { return { msgContents: ['界面显示错乱,不兼容', '启动缓慢,运行卡顿', 'UI不好看', '偶发性崩溃','等待loading时间过长'], stars: [1, 2, 3, 4, 5], imageList: [], sendDate: { score: 0, content: '', contact: '' } }; }, onLoad() { this.deviceInfo = { // appid: plus.runtime.appid, appid: '__UNI__EEA6732', imei: plus.device.imei, //设备标识 p: plus.os.name === 'Android' ? 'a' : 'i', //平台类型,i表示iOS平台,a表示Android平台。 md: plus.device.model, //设备型号 app_version: plus.runtime.version, plus_version: plus.runtime.innerVersion, //基座版本号 os: plus.os.version, net: '' + plus.networkinfo.getCurrentType() }; this.sendDate = Object.assign(this.deviceInfo, this.sendDate); }, methods: { /** * 关闭图片 * @param {Object} e */ close(e) { this.imageList.splice(e, 1); }, /** * 快速输入 */ chooseMsg() { uni.showActionSheet({ itemList: this.msgContents, success: res => { this.sendDate.content = this.msgContents[res.tapIndex]; } }); }, /** * 选择图片 */ chooseImg() { //选择图片 uni.chooseImage({ sourceType: ['camera', 'album'], sizeType: 'compressed', count: 5 - this.imageList.length, success: res => { this.imageList = this.imageList.concat(res.tempFilePaths); } }); }, /** * 评分 * @param {Object} e */ chooseStar(e) { //点击评星 this.sendDate.score = e; }, /** * 预览图片 * @param {Object} index */ previewImage(index) { uni.previewImage({ urls: this.imageList, current: this.imageList[index] }); }, /** * 提交 */ send() { //发送反馈 if (this.sendDate.content.length === 0) { uni.showModal({ content: '请输入问题和意见', showCancel: false }); return; } uni.showLoading({ title: '上传中...' }); let imgs = this.imageList.map((value, index) => { return { name: 'images' + index, uri: value }; }); // TODO 服务端限制上传文件一次最大不超过 2M, 图片一次最多不超过5张 this.request(this.sendDate, imgs) .then(res => { if (typeof res.data === 'string') { res.data = JSON.parse(res.data); } if (res.statusCode === 200 && res.data && res.data.ret === 0) { uni.showModal({ content: '反馈成功', showCancel: false }); setTimeout(() => { uni.navigateBack({ }) }, 1000) this.imageList = []; this.sendDate = Object.assign(this.deviceInfo, { score: 0, content: '', contact: '' }); } else if (res.statusCode !== 200) { uni.showModal({ content: '反馈失败,错误码为:' + res.statusCode, showCancel: false }); } else { uni.showModal({ content: '反馈失败', showCancel: false }); } }) .catch(err => { console.log(err); }); }, /** * 发送请求到后台 */ request(sendDate, imgs) { return new Promise((resolve, reject) => { let fromData = { url: 'https://service.dcloud.net.cn/feedback', success: res => { resolve(res); }, fail: res => { reject(res); }, complete() { uni.hideLoading(); } }; if (imgs.length > 0) { fromData.files = imgs; fromData.formData = sendDate; uni.uploadFile(fromData); } else { fromData.data = sendDate; fromData.method = 'POST'; uni.request(fromData); } }); } } }; </script> <style scoped> page { background-color: #efeff4; } .input-view { font-size: 28rpx; } /* 上传 */ .uni-uploader { flex: 1; flex-direction: column; } .uni-uploader-head { display: flex; flex-direction: row; justify-content: space-between; } .uni-uploader-info { color: #B2B2B2; } .uni-uploader-body { margin-top: 16rpx; } .uni-uploader__files { display: flex; flex-direction: row; flex-wrap: wrap; } .uni-uploader__file { margin: 10rpx; width: 210rpx; height: 210rpx; } .uni-uploader__img { display: block; width: 210rpx; height: 210rpx; } .uni-uploader__input-box { position: relative; margin: 10rpx; width: 208rpx; height: 208rpx; border: 2rpx solid #D9D9D9; } .uni-uploader__input-box:before, .uni-uploader__input-box:after { content: " "; position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); background-color: #D9D9D9; } .uni-uploader__input-box:before { width: 4rpx; height: 79rpx; } .uni-uploader__input-box:after { width: 79rpx; height: 4rpx; } .uni-uploader__input-box:active { border-color: #999999; } .uni-uploader__input-box:active:before, .uni-uploader__input-box:active:after { background-color: #999999; } .uni-uploader__input { position: absolute; z-index: 1; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; } /*问题反馈*/ .feedback-title { display: flex; flex-direction: row; justify-content: space-between; align-items: center; padding: 20rpx; color: #8f8f94; font-size: 28rpx; } .feedback-star-view.feedback-title { justify-content: flex-start; margin: 0; } .feedback-quick { position: relative; padding-right: 40rpx; } .feedback-quick:after { font-family: uniicons; font-size: 40rpx; content: '\e581'; position: absolute; right: 0; top: 50%; color: #bbb; -webkit-transform: translateY(-50%); transform: translateY(-50%); } .feedback-body { background: #fff; } .feedback-textare { height: 200rpx; font-size: 34rpx; line-height: 50rpx; width: 100%; box-sizing: border-box; padding: 20rpx 30rpx 0; } .feedback-input { font-size: 34rpx; height: 50rpx; min-height: 50rpx; padding: 15rpx 20rpx; line-height: 50rpx; } .feedback-uploader { padding: 22rpx 20rpx; } .feedback-star { font-family: uniicons; font-size: 40rpx; margin-left: 6rpx; } .feedback-star-view { margin-left: 20rpx; } .feedback-star:after { content: '\e408'; } .feedback-star.active { color: #FFB400; } .feedback-star.active:after { content: '\e438'; } .feedback-submit { background: #007AFF; color: #FFFFFF; margin: 20rpx; } .close-view { text-align: center; line-height: 14px; height: 16px; width: 16px; border-radius: 50%; background: #ff5053; color: #ffffff; position: absolute; top: -6px; right: -4px; font-size: 12px; } </style>