<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>QQ/邮箱</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 class="feedback-title"><text>用户反馈的结果可在app打包后于DCloud开发者中心查看</text></view> </view> </template> <script> export default { data() { return { msgContents: ['界面显示错乱', '启动缓慢,卡出翔了', 'UI无法直视,丑哭了', '偶发性崩溃'], stars: [1, 2, 3, 4, 5], imageList: [], sendDate: { score: 0, content: '', contact: '' } }; }, onLoad() { this.deviceInfo = { // appid: plus.runtime.appid, appid: '__UNI__5D0B0CA', 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 }); 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> page { background-color: #efeff4; } .input-view { font-size: 28rpx; } .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>